最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

$parse和$eval

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

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

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ù)接收一個表達式作為參數(shù)并返回一個函數(shù). 這個函數(shù)可以被調(diào)用, 其中的參數(shù)是一個context對象, 通常來說是作用域.
另外, 這個函數(shù)有一個assign屬性. 它也是一個函數(shù), 可以用來在給定的上下文中改變這個表達式的值. 最后一行代碼演示了如何使用locals來覆蓋context對象.

$eval用起來要簡單很多, 因為它的上下文已經(jīng)被指定為scope對象.

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源碼中看出來, 可以說$eval是為了讓$parse在scope中使用更方便的語法糖.

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

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

$observe和$watch

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

$watch是scope對象上的一個方法, watch表達式很靈活, 可以是一個函數(shù), 可以是scope上的屬性, 也可以是一個字符串形式的表達式. 監(jiān)聽scope上的屬性名或表達式的時候, 會利用$parse服務(wù)將表達式轉(zhuǎn)換成一個函數(shù), 這個函數(shù)會在$digest中被調(diào)用. $watch的第三個參數(shù)"objectEquality", 指定比較對象的方式, 如果為true,則用angular.equals, 否則直接比較引用. 默認為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
});

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

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

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

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

$watchGroup和$watchCollection

$watchGroup是用來監(jiān)聽一組表達式. 數(shù)組中任意表達式的變化都會觸發(fā)監(jiān)聽函數(shù).

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

$watchCollection用來監(jiān)聽一個對象(包括數(shù)組), 當這個對象的任意屬性發(fā)生變化時, 觸發(fā)監(jiān)聽函數(shù). 和$watch一樣,第一次參數(shù)可以是一個返回一個對象的函數(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都返回一個移除監(jiān)聽的函數(shù). 當需要取消監(jiān)聽的時候, 直接調(diào)用.

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

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

相關(guān)文章

  • angular.js中解決跨域問題的三種方式

    angular.js中解決跨域問題的三種方式

    跨域,前端開發(fā)中經(jīng)常遇到的問題,下面這篇文章主要給大家介紹了關(guān)于angular.js中解決跨域問題的三種方式,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。
    2017-07-07
  • Angular5.1新功能分享

    Angular5.1新功能分享

    這篇文章主要介紹了Angular5.1新功能以及相關(guān)的用法,需要的朋友參考學習下吧。
    2017-12-12
  • 使用ngView配合AngularJS應(yīng)用實現(xiàn)動畫效果的方法

    使用ngView配合AngularJS應(yīng)用實現(xiàn)動畫效果的方法

    這篇文章主要介紹了使用ngView配合AngularJS應(yīng)用實現(xiàn)動畫效果的方法,AngularJS是十分熱門的JavaScript庫,需要的朋友可以參考下
    2015-06-06
  • AngularJS1.X學習筆記2-數(shù)據(jù)綁定詳解

    AngularJS1.X學習筆記2-數(shù)據(jù)綁定詳解

    本篇文章主要介紹了AngularJS1.X學習筆記2-數(shù)據(jù)綁定詳解,具有一定的參考價值,有興趣的可以了解一下。
    2017-04-04
  • 深入理解angular2啟動項目步驟

    深入理解angular2啟動項目步驟

    本篇文章主要介紹了深入理解angular2啟動步驟 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 簡述AngularJS相關(guān)的一些編程思想

    簡述AngularJS相關(guān)的一些編程思想

    這篇文章主要介紹了AngularJS相關(guān)的一些編程思想,AngularJS是一款熱門的JavaScript庫,推薦!需要的朋友可以參考下
    2015-06-06
  • angular十大常見問題

    angular十大常見問題

    本文主要介紹了angular十大常見問題,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • 利用VS Code開發(fā)你的第一個AngularJS 2應(yīng)用程序

    利用VS Code開發(fā)你的第一個AngularJS 2應(yīng)用程序

    這篇文章主要給大家介紹了關(guān)于利用VS Code如何開發(fā)你的第一個AngularJS 2應(yīng)用程序的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友下面來一起看看吧。
    2017-12-12
  • angularjs學習筆記之完整的項目結(jié)構(gòu)

    angularjs學習筆記之完整的項目結(jié)構(gòu)

    這篇文章主要介紹了angularjs學習筆記之完整的項目結(jié)構(gòu)的相關(guān)資料,需要的朋友可以參考下
    2015-09-09
  • Angular ng-animate和ng-cookies用法詳解

    Angular ng-animate和ng-cookies用法詳解

    本文講一下Angular中動畫應(yīng)用的部分。這篇文章主要介紹了Angular ng-animate和ng-cookies用法詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04

最新評論

常德市| 兖州市| 靖江市| 纳雍县| 梅河口市| 山阳县| 朝阳区| 额济纳旗| 池州市| 万山特区| 威宁| 临泽县| 屯昌县| 乌恰县| 盐边县| 广平县| 梅州市| 崇明县| 兰州市| 凤阳县| 仙桃市| 改则县| 乌鲁木齐县| 阳新县| 富顺县| 大名县| 海淀区| 安多县| 项城市| 英山县| 汝州市| 镶黄旗| 迭部县| 海阳市| 甘孜县| 恩平市| 大同县| 开鲁县| 沙坪坝区| 桂东县| 阿合奇县|