国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

Angularjs中的$apply及優化使用詳解

2024-05-06 15:32:59
字體:
來源:轉載
供稿:網友

前言

對于一個在前端屬于純新手的我來說,Javascript都還是一知半解,要想直接上手angular JS,遇到的阻力還真是不少。不過我相信,只要下功夫,即使是反人類的設計也不是什么大的問題。

今天,我們要聊得是Angularjs中的小明星$apply。當我們數據更新了,但是view層卻沒反應時,總能聽到有人說,用apply吧,然后,懵懂無知的我們,在賦值代碼后面加了$scope.$apply() ,然后就驚喜的發現。噢,真的更新了。

然而,有些時候,編譯器會無情的給你返回

Error: $digest already in progress

那么,導致這些現象的原因時什么的呢?$apply究竟干了啥?聽我慢慢到來。

一.$apply的作用

$apply()函數可以從Angular框架的外部讓表達式在Angular上下文內部執行。

上面是AngularJs權威教程中的一句話。什么意思呢?

首先,你要清楚,在原生js或者第三方框架下,修改model,是有可能不會觸發視圖更新的,比如setTimeout、jquery插件。為什么?因為他們脫離了Angularjs的上下文,Angularjs并不能監聽到數據的改變。看例子。

1.setTimeout

html:

<p>{{name}}</p>

js:

$scope.name="張三";setTimeout(function(){$scope.name = '李四';//$scope.$apply()},500)

首先,name等于張三,500ms后,我把他賦值為李四,但是,頁面上并沒有改變,依然是張三。

而,我們把$scope.$apply()放開,就正常了,張三成功變為李四。

2.第三方插件

html:

<p>Date: <input type="text" id="datepicker"></p><p><header>所選日期</header>{{selectedDate}}</p>

js:

$scope.selectedDate = '';$( function() { $( "#datepicker" ).datepicker({ onClose: function( selectedDate ) { $scope.selectedDate = selectedDate; // $scope.$apply(); } });} );

這是jquery的datepicker插件,當我們選定日期后,下面的日期應該隨之顯現,而現在卻沒有。這種情況就必須依靠$apply(),才能更新視圖。

以上兩種情況,都因為不處于Angularjs上下文中,導致監聽不到數據的變化。而$apply究竟干了什么,才導致數據更新正常了呢?

其實$apply相當于一個觸發器,它的作用就是觸發digest循環,從而更新視圖。

在digest是Angularjs的核心,是它實現了神奇的數據綁定。凡是觸發事件,必會觸發digest循環,比如,我們數值的ng事件,click啊,change,實際上都是觸發了digest循環。

所以,我們所做的事,其實就是手動觸發了digest循環。關于digest循環,屬于題外話,這里不做過多介紹,想深入了解的同學,可以看看書籍,或者百度。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 远安县| 牙克石市| 喀喇沁旗| 岳西县| 怀来县| 云南省| 泰和县| 巴彦淖尔市| 金沙县| 哈巴河县| 庆阳市| 卓尼县| 宜都市| 方山县| 博客| 旬邑县| 尤溪县| 河东区| 平泉县| 祁连县| 赤城县| 宾阳县| 玉龙| 和平区| 甘谷县| 通渭县| 晋宁县| 达孜县| 芦溪县| 鸡东县| 临猗县| 称多县| 荣昌县| 瑞丽市| 麻城市| 孟连| 通江县| 吉隆县| 琼海市| 上杭县| 浮梁县|