欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

AngularJs $parse、$eval和$observe、$watch詳解

 更新時(shí)間:2016年09月21日 10:16:29   作者:菲汐  
這篇文章主要介紹了AngularJs $parse、$eval和$observe、$watch的相關(guān)資料,需要的朋友可以參考下

$parse和$eval

$parse和$eval這兩個(gè)函數(shù)都可以解析表達(dá)式的值.

它們的區(qū)別在于$parse是一個(gè)服務(wù), 可以注入使用. $eval是scope對(duì)象上的一個(gè)方法, 我們只能在能訪問(wèn)scope的場(chǎng)景下使用它.

var getter = $parse('user.name');
var setter = getter.assign;
var context = {user: {name: 'John Doe'};
var locals = {user: {name: 'Doe John'};

getter(context); //John Doe
setter(context, 'new name');
getter(context); //new name
getter(context, locals); //Doe John

$parse服務(wù)接收一個(gè)表達(dá)式作為參數(shù)并返回一個(gè)函數(shù). 這個(gè)函數(shù)可以被調(diào)用, 其中的參數(shù)是一個(gè)context對(duì)象, 通常來(lái)說(shuō)是作用域.
另外, 這個(gè)函數(shù)有一個(gè)assign屬性. 它也是一個(gè)函數(shù), 可以用來(lái)在給定的上下文中改變這個(gè)表達(dá)式的值. 最后一行代碼演示了如何使用locals來(lái)覆蓋context對(duì)象.

$eval用起來(lái)要簡(jiǎn)單很多, 因?yàn)樗纳舷挛囊呀?jīng)被指定為scope對(duì)象.

var scope = $rootscope.$new(true);
scope.a = 1;
scope.b = 2;
scope.$eval('a + b')//3
scope.$eval(function(scope){
 return scope.a + scope.b;
});//3

關(guān)于$parse和$eval之間的關(guān)系, 我們能從Angular源碼中看出來(lái), 可以說(shuō)$eval是為了讓$parse在scope中使用更方便的語(yǔ)法糖.

$eval: function(expr, locals){
 return $parse(expr)(this, locals);
}

$eval還有個(gè)同胞兄弟, $evalAsync, 它并不會(huì)立刻計(jì)算表達(dá)式的值, 而是將表達(dá)式緩存起來(lái), 等到下一次$digest ( 臟檢查 ) 的時(shí)候執(zhí)行. 以獲取更好的性能.

$observe和$watch

$observe和$watch都可以監(jiān)聽(tīng)表達(dá)式值的變化. 但有顯著的不同.
$observe是angular指令中l(wèi)ink函數(shù)第三個(gè)參數(shù) ( attrs ) 的一個(gè)方法. 只能在指令的link函數(shù)中使用它. 它是通過(guò)$evalAsync函數(shù)實(shí)現(xiàn)監(jiān)控的.

$watch是scope對(duì)象上的一個(gè)方法, watch表達(dá)式很靈活, 可以是一個(gè)函數(shù), 可以是scope上的屬性, 也可以是一個(gè)字符串形式的表達(dá)式. 監(jiān)聽(tīng)scope上的屬性名或表達(dá)式的時(shí)候, 會(huì)利用$parse服務(wù)將表達(dá)式轉(zhuǎn)換成一個(gè)函數(shù), 這個(gè)函數(shù)會(huì)在$digest中被調(diào)用. $watch的第三個(gè)參數(shù)"objectEquality", 指定比較對(duì)象的方式, 如果為true,則用angular.equals, 否則直接比較引用. 默認(rèn)為false.

//html
<div book="{{book.name}}"></div>
//js
attrs.$observe('book', function(newValue){
 //just have one parameter, can't get old value
});
scope.$watch(attrs.book, function(newValue, oldValue){
 //get undefined
});

當(dāng)你需要監(jiān)聽(tīng)一個(gè)包含"{{}}"的DOM屬性時(shí), 使用$observe, 如果用$watch, 只能得到undefined. 反之, 就用$watch. 如果用$observe, 只能得到一個(gè)固定的字符串.

//html
<div book="book.name"></div>
//js
attrs.$observe('book', function(newValue){
 //always get 'book.name'
});
scope.$watch(attrs.book, function(newValue, oldValue){
});

有一個(gè)特殊的情況, 當(dāng)你的指令使用了獨(dú)立的作用域 ( scope:{} ) , 那些應(yīng)用了"@"語(yǔ)法的DOM屬性, 即使包含"{{ }}", 也可以被$watch.

因?yàn)锧前綴標(biāo)識(shí)符, 它的實(shí)現(xiàn)是通過(guò)$observe去監(jiān)聽(tīng)DOM屬性的變化, 這就是為什么@attr的值只能是字符串或是"{{}}", 而不能是scope上的屬性, 所以最終$watch看到的表達(dá)式是沒(méi)有"{{ }}"的. 而"="和"&"則是基于$watch實(shí)現(xiàn). 所以=attr, &attr的值不能包含"{{ }}", 但可以直接使用scope上的屬性.

$watchGroup和$watchCollection

$watchGroup是用來(lái)監(jiān)聽(tīng)一組表達(dá)式. 數(shù)組中任意表達(dá)式的變化都會(huì)觸發(fā)監(jiān)聽(tīng)函數(shù).

$scope.teamScore = 0;
$scope.time = 0;
$scope.$watchGroup(['teamScore', 'time'], function(newVal, oldVal) {
 //newVal and oldVal are both array
});

$watchCollection用來(lái)監(jiān)聽(tīng)一個(gè)對(duì)象(包括數(shù)組), 當(dāng)這個(gè)對(duì)象的任意屬性發(fā)生變化時(shí), 觸發(fā)監(jiān)聽(tīng)函數(shù). 和$watch一樣,第一次參數(shù)可以是一個(gè)返回一個(gè)對(duì)象的函數(shù).

$scope.names = ['igor', 'matias', 'misko', 'james'];
$scope.dataCount = 4;

$scope.$watchCollection('names', function (newVal, oldVal) {
 $scope.dataCount = newVal.length;
});

$timeout(function(){
  $scope.names.pop();
},2000);

$observe, $watch, $watchGroup, $watchCollection都返回一個(gè)移除監(jiān)聽(tīng)的函數(shù). 當(dāng)需要取消監(jiān)聽(tīng)的時(shí)候, 直接調(diào)用.

var off = scope.$watch('name', function(newValue, oldValue){
});
off();

以上就是對(duì)AngularJs $parse、$eval和$observe、$watch的知識(shí)詳解,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • AngularJS實(shí)現(xiàn)根據(jù)變量改變動(dòng)態(tài)加載模板的方法

    AngularJS實(shí)現(xiàn)根據(jù)變量改變動(dòng)態(tài)加載模板的方法

    這篇文章主要介紹了AngularJS實(shí)現(xiàn)根據(jù)變量改變動(dòng)態(tài)加載模板的方法,結(jié)合實(shí)例形式簡(jiǎn)單分析了AngularJS動(dòng)態(tài)加載模板的主要操作技巧與模板實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2016-11-11
  • Angular如何由模板生成DOM樹(shù)的方法

    Angular如何由模板生成DOM樹(shù)的方法

    這篇文章主要介紹了Angular如何由模板生成DOM樹(shù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • angular6.0開(kāi)發(fā)教程之如何安裝angular6.0框架

    angular6.0開(kāi)發(fā)教程之如何安裝angular6.0框架

    這篇文章主要介紹了angular6.0開(kāi)發(fā)教程之如何安裝angular6.0框架,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • angularjs的單選框+ng-repeat的實(shí)現(xiàn)方法

    angularjs的單選框+ng-repeat的實(shí)現(xiàn)方法

    今天小編就為大家分享一篇angularjs的單選框+ng-repeat的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • 詳解基于Bootstrap+angular的一個(gè)豆瓣電影app

    詳解基于Bootstrap+angular的一個(gè)豆瓣電影app

    本篇文章主要介紹了基于Bootstrap+angular的一個(gè)豆瓣電影app ,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-06-06
  • 在Angular中使用NgTemplateOutlet創(chuàng)建可重用組件的流程步驟

    在Angular中使用NgTemplateOutlet創(chuàng)建可重用組件的流程步驟

    在 Angular 中,使用 NgTemplateOutlet 而不是創(chuàng)建特定組件,可以使組件在不修改組件本身的情況下輕松修改為各種用例,在本文中,您將接受一個(gè)現(xiàn)有組件并重寫(xiě)它以使用 NgTemplateOutlet,需要的朋友可以參考下
    2024-03-03
  • 強(qiáng)大的 Angular 表單驗(yàn)證功能詳細(xì)介紹

    強(qiáng)大的 Angular 表單驗(yàn)證功能詳細(xì)介紹

    本篇文章主要介紹了強(qiáng)大的 Angular 表單驗(yàn)證功能詳細(xì)介紹,使用 Angular 的內(nèi)置表單校驗(yàn)?zāi)軌蛲瓿山^大多數(shù)的業(yè)務(wù)場(chǎng)景的校驗(yàn)需求,有興趣的可以了解一下
    2017-05-05
  • AngularJS基礎(chǔ) ng-paste 指令簡(jiǎn)單示例

    AngularJS基礎(chǔ) ng-paste 指令簡(jiǎn)單示例

    本文主要介紹AngularJS ng-paste 指令,這里對(duì)ng-paste 指令的基礎(chǔ)資料做了整理,并附有代碼示例,有需要的朋友可以參考下
    2016-08-08
  • AngularJS通過(guò)$sce輸出html的方法

    AngularJS通過(guò)$sce輸出html的方法

    不知道大家有沒(méi)有發(fā)現(xiàn)在用AngularJS作為前端搭建個(gè)人博客的時(shí)候,發(fā)現(xiàn)用AngularJs輸出html的時(shí)候,瀏覽器并不解析這些html標(biāo)簽,這里我們需要其顯示angular輸出的html能被瀏覽器解析怎么辦呢?不知道Angularjs如何實(shí)現(xiàn)這種功能的通過(guò)這篇文章來(lái)看看吧。
    2016-09-09
  • 詳解在AngularJS的controller外部直接獲取$scope

    詳解在AngularJS的controller外部直接獲取$scope

    本篇文章主要介紹了詳解在AngularJS的controller外部直接獲取$scope ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06

最新評(píng)論