成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

AngularJS 中的 $digest() 和 $apply()

alanoddsoff / 994人閱讀

摘要:但是如果更改一個不在執(zhí)行上下文中的數(shù)據(jù)模型就需要人為的調用來提醒數(shù)據(jù)發(fā)生變化了。在當前循環(huán)結束后它會再次啟動來檢查是否有數(shù)據(jù)發(fā)生變化這被叫做臟檢查。它會多運行一次以確保沒有數(shù)據(jù)發(fā)生變化。

1. 什么時候需要人為調用 $apply()?

AngularJS 只會關心在 AngularJS 的執(zhí)行上下文中 發(fā)生的數(shù)據(jù)模型(model)的變化(比如: 改變數(shù)據(jù)的代碼在 $apply() 里面)。AngularJS 內建的指令 也會自動觸發(fā) $digest 循環(huán), 所以任何數(shù)據(jù)模型(model)的改變也都會反映到視圖中。 但是, 如果更改一個 不在 AngularJS 執(zhí)行上下文中 的數(shù)據(jù)模型(model), 就需要人為的調用 $apply() 來提醒 AngularJS 數(shù)據(jù)發(fā)生變化了。

例如, 但使用JavaScript的 setTimeout() 函數(shù)來更新一個數(shù)據(jù)模型的時候, AngularJS 就沒有辦法知道你改變了數(shù)據(jù)模型。這種情況下, 就需要調用 $apply() 來觸發(fā) $digest 循環(huán)了。類似的, 如果自定義了一個指令, 這個指令設置了一個 DOM 事件監(jiān)聽器, 更改數(shù)據(jù)模型的代碼在時間處理函數(shù)里, 那么也需要調用 $apply() 來保證更改能反映出來。

DEMO:

HTML 代碼:





    demo
    
    



    
Delayed Message: {{message}}

JS 代碼:

var myApp = angular.module("myApp", [])

myApp.controller("myController", ["$scope", "$timeout", function($scope, $timeout) {
    $scope.getMessage = function() {

        // 方法1:
        setTimeout(function() {
            // 把需要寫的邏輯放入$apply函數(shù)內
            $scope.$apply(function() {
                $scope.message = "Fetched after 3 seconds"
                console.log("message: ", $scope.message);
            })
        }, 2000)

        // 方法2:

        // $timeout(function() {
        //     $scope.message = "Fetched after 3 seconds"
        //     console.log("message: ", $scope.message);
        // }, 2000)

        // 方法3:

        // setTimeout(function() {
        //     $scope.message = "Fetched after 3 seconds"
        //     console.log("message: ", $scope.message);
        //     $scope.$apply() // 這里觸發(fā)了 $digest循環(huán)
        // }, 2000)
    }

    $scope.getMessage()
}])

注意:

但需要延時的時候, 盡可能的使用 $timeout, 這樣, 就不用人為的去調用 $apply() 了。
在調用 $apply() 的時候, 應該總是要傳入函數(shù)參數(shù), 因為當為 $apply() 傳入函數(shù)的時候, 這個函數(shù)在調用的時候是包含在 try..catch 中, 并且任何發(fā)生的異常都能夠被 $exceptionHandler 服務所接收。

2. $digest 循環(huán)要執(zhí)行多少次呢

$digest 循環(huán)并不只是運行一次。在當前循環(huán)結束后, 它會再次啟動來檢查是否有數(shù)據(jù)發(fā)生變化, 這被叫做 臟檢查。$digest 循環(huán)會一直保持循環(huán)直到再也沒有數(shù)據(jù)模型發(fā)生改變, 或者達到最大的循環(huán)次數(shù)(10次)。

注意: $digest 至少會循環(huán)兩次即使監(jiān)聽函數(shù)沒有更改任何數(shù)據(jù)模型。它會多運行一次以確保沒有數(shù)據(jù)發(fā)生變化。

3. 總結

如果 AngularJS 不能檢測到你的更改, 那么就必須人為調用 $apply()。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/86905.html

相關文章

  • angular性能優(yōu)化心得

    摘要:本文針對的讀者具備性能優(yōu)化的相關知識雅虎條性能優(yōu)化原則高性能網(wǎng)站建設指南等擁有實戰(zhàn)經(jīng)驗。這種機制能減少瀏覽器次數(shù),從而提高性能。僅會檢查該和它的子,當你確定當前操作僅影響它們時,用可以稍微提升性能。 搬運自: http://atian25.github.io/2014/05/09/angular-performace/ 不知不覺,在項目中用angular已經(jīng)半年多了,踩了很多坑...

    guqiu 評論0 收藏0
  • 總結的AngularJS1版本的一些面試問題

    摘要:綜上所述兩者是出于不同的目的被創(chuàng)建的,解決的也是不同的問題。檢測模型變化的過程稱為循環(huán)。由指令注冊的事件處理函數(shù)執(zhí)行。該回調函數(shù)會更新插值表達式所在的屬性。模塊主要關系腳本加載問題。 AngularJS面試題 1.與jQuery的比較 jQuery js函數(shù)庫 封裝簡化dom操作 使用jquery的思想是:我擁有一個DOM元素并且想讓它去做某件事。也就是命令式編程思想。 angula...

    defcon 評論0 收藏0
  • angularJS開發(fā)的注意事項匯總

    摘要:作為一個應該具有經(jīng)??偨Y反思的習慣如果不能及時總結可能就會忘記自己踩過的很多坑然后會導致同一個坑踩很多次所以我打算把這些都記錄下來以方便是對自己的重復記憶避免無效的另一方面可以希望可以給遇到相似問題的同僚們一些收獲手動觸發(fā)臟檢查在開發(fā)過程中 作為一個coder,應該具有經(jīng)常總結反思的習慣,如果不能及時總結,可能就會忘記自己踩過的很多坑,然后會導致同一個坑踩很多次,所以我打算把這些都記錄...

    Null 評論0 收藏0
  • 關于angularJs中使用$.ajax的注意點

    摘要:的特色是雙向綁定,復雜點說,有一個臟值檢測系統(tǒng),主要包括和觸發(fā)里面有一個玩意叫被認為是使與第三方庫混合使用最標準的方式。處理完成之后加一個即可,這個方法還適用于等但是我依舊建議在能不使用第三方庫的時候就不要使用。 從技術上來講,angular 與 jquery混用,是一件不太合適的,但是為什么這個話題爭論至今依舊仁者見仁智者見智,除了便捷度,還有可能就是jquery有些地方確實比ang...

    wayneli 評論0 收藏0

發(fā)表評論

0條評論

alanoddsoff

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<