成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

ngModel使用說(shuō)明小demo

zorro / 2364人閱讀

摘要:關(guān)于個(gè)管道的用法會(huì)在下一篇里面講。一般需要通過(guò)去調(diào)用方法去時(shí)和上掛載的屬性值保持一致。方法是可以重新自定義的上的屬性值,已經(jīng)發(fā)生變化利用這些值再次可以再次做相應(yīng)的處理,然后更新抽時(shí)間把關(guān)于再補(bǔ)上。參考資料指令中使用中的的詳解

第一個(gè)點(diǎn),要了解下:

DOM value

$viewValue

$modelValue

scope上掛載的屬性的值

一般有2個(gè)流程:

$viewValue -->> $modelValue -->> scope 上掛載的屬性的值

scope上掛載的屬性的值 -->> $modelValue -->> $viewValue

ngModel常用的場(chǎng)景就是如果你使用第三方的插件例如時(shí)間插件,每次選擇時(shí)間后都是更新DOM value的值,這個(gè)時(shí)候DOM value上的值事實(shí)上是你需要綁定到scope屬性上的值。那么這個(gè)時(shí)候就需要ngModelController。

在第一個(gè)流程當(dāng)中,例如我加載了一個(gè)時(shí)間插件:pikaday

    html:
    
    

選擇的時(shí)間為: {{date.from}}

js: angular.module("demoApp", []).controller("demoCtrl", function($scope) { $scope.date = { from: "" }; $scope.$watch("date.from", function(val) { console.log(val); }); }) .directive("testDirective", ["$timeout", function($timeout) { return { restrict: "EA", require: "?ngModel", link: function(scope, ele, attrs, ngModel) { template: "", link: function (scope, ele, attr, ngModel) { var picker = new Pikaday({ field: $("#pikadayTimerPicker")[0], firstDay: 0, yearRange: [2000, 2020], format: "YYYY-MM-DD", hours24format : false, showTime : true, splitTimeView : true, showSeconds : true, minutesStep : 5, i18n: { previousMonth : "上月", nextMonth : "下月", months : ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"], weekdays : ["周日","周一","周二","周三","周四","周五","周六"], weekdaysShort : ["日","一","二","三","四","五","六"] }, onSelect: function () { if(!ngModel) return; //如果ngModel不存在 ngModel.$setViewValue(this._d); } }); } } } })

onSelect回調(diào)事件里面,調(diào)用了ngModel.$setViewValue方法,它的作用就是使DOM value -->> $viewValue -->> $modelValue -->> scope上綁定的屬性.

第二個(gè)流程當(dāng)中,比如你需要初始化一個(gè)時(shí)間,這個(gè)時(shí)間可能是從你后臺(tái)調(diào)過(guò)來(lái)的,或者是獲取的本地的時(shí)間.那么你首先要綁定scope上的屬性值,但是這個(gè)時(shí)候在時(shí)間插件上面顯示的時(shí)間并不是scope上綁定的屬性值,這個(gè)時(shí)候就需要$render方法了:

    
    $scope.data.from = $filter(new Date().valueOf())("YYYY-MM-DD hh:mm:ss");


    xxxxx
        var picker = new Picker({ xxxx });
        
        //這個(gè)地方調(diào)用
        ngModel.$render = function() {
            $("#pikadayTimerPicker").val(ngModel.$viewValue);
        }
    xxxxx

這里執(zhí)行的流程就是:
scope上綁定的屬性值發(fā)生變化 -->> $modelValue -->> $viewValue -->> 調(diào)用$("#pikadayTimerPicker").val(ngModel.$viewValue)去更新DOM value.

在2個(gè)流程當(dāng)中還應(yīng)當(dāng)注意一些地方:

第一個(gè)流程當(dāng)中會(huì)經(jīng)過(guò)$parsers, $validators2個(gè)管道。
第二個(gè)流程當(dāng)中會(huì)經(jīng)過(guò)$formatters,$render, $validators 3個(gè)管道。

關(guān)于$parses, $formatters , $validators 3個(gè)管道的用法會(huì)在下一篇里面講。

這里著重講一下源碼里的$render方法(文檔23189行),

    ctrl.$render = function() {
    // Workaround for Firefox validation #12102.
    var value = ctrl.$isEmpty(ctrl.$viewValue) ? "" : ctrl.$viewValue;
    if (element.val() !== value) {
      element.val(value);
    }
  };

這里就是首先判斷$viewValue是否為空,然后再判斷當(dāng)前元素的DOM Value$viewValue是否一樣,再選擇是否更新視圖。

另外就是需要注意的一個(gè)地方(文檔26947行):

    $scope.$watch(function ngModelWatch() {
    var modelValue = ngModelGet($scope); //獲取scope上綁定的ng-model的值
    
    // if scope model value and ngModel value are out of sync
    // TODO(perf): why not move this to the action fn?
    if (modelValue !== ctrl.$modelValue &&
       // checks for NaN is needed to allow setting the model to NaN when there"s an asyncValidator
       (ctrl.$modelValue === ctrl.$modelValue || modelValue === modelValue)
    ) {
      ctrl.$modelValue = ctrl.$$rawModelValue = modelValue;
      parserValid = undefined;

      var formatters = ctrl.$formatters,
          idx = formatters.length;

      var viewValue = modelValue;
      while (idx--) {
        viewValue = formatters[idx](viewValue);
      }
        
      if (ctrl.$viewValue !== viewValue) {
        ctrl.$$updateEmptyClasses(viewValue);
        ctrl.$viewValue = ctrl.$$lastCommittedViewValue = viewValue;
        ctrl.$render();

        ctrl.$$runValidators(modelValue, viewValue, noop);
      }
    }

    return modelValue;
  });

$render方法一般是當(dāng)ng-model的值發(fā)生變化的時(shí)候就會(huì)觸發(fā):

例如ng-model直接放在input,select標(biāo)簽內(nèi),那么ng會(huì)自動(dòng)響應(yīng)ng-model變化后,便會(huì)觸發(fā)這個(gè)方法,來(lái)使Dom$scope上掛載的屬性值保持相同.

指令內(nèi)部封裝了input標(biāo)簽,但是ng-model是在指令外部的外部標(biāo)簽下時(shí)。一般需要通過(guò)event handler去調(diào)用ngModel.$setViewValue方法去時(shí)DOM Valuescope上掛載的屬性值保持一致。具體的demo就如上例。

ngModel.$render方法是可以重新自定義的:

    ngModel.$render = function() {
        // scope上的屬性值,$modelValue, $viewValue已經(jīng)發(fā)生變化
        // 利用這些值再次可以再次做相應(yīng)的處理,然后更新DOM value
    }

抽時(shí)間把關(guān)于ngModel再補(bǔ)上。睡覺(jué)。

參考資料:

angular指令中使用ngModelController
Angular中ngModel的$render的詳解

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/79514.html

相關(guān)文章

  • @angular/forms 源碼解析之雙向綁定

    摘要:由于的屬性提供了令牌,并且該令牌指向的對(duì)象就是,所以構(gòu)造函數(shù)中注入的令牌包含的對(duì)象數(shù)組只有一個(gè)。這樣的構(gòu)造函數(shù)里就會(huì)包含一個(gè)對(duì)象,然后把這個(gè)傳給對(duì)象,最后注冊(cè)回調(diào),這樣以后值更新時(shí)就會(huì)運(yùn)行。整個(gè)包的設(shè)計(jì)也是按照這種數(shù)據(jù)流形式,并不復(fù)雜。 我們知道,Angular 的 @angular/forms 包提供了 NgModel 指令,來(lái)實(shí)現(xiàn)雙向綁定,即把一個(gè) JS 變量(假設(shè)為 name)與...

    yangrd 評(píng)論0 收藏0
  • angular1學(xué)習(xí)筆記,view model 的同步過(guò)程

    摘要:但實(shí)際上這時(shí)程序并沒(méi)有計(jì)算手續(xù)費(fèi)。經(jīng)過(guò)排查并查閱文檔之后,發(fā)現(xiàn)是的問(wèn)題。本文沒(méi)有具體介紹和管道,關(guān)于這部分可以參考文中給出的鏈接 事情起源于在項(xiàng)目中遇到的一個(gè)小問(wèn)題:項(xiàng)目中需要一個(gè)輸入框輸入賣出產(chǎn)品數(shù)量,并且在用戶輸入后根據(jù)輸入數(shù)據(jù)計(jì)算手續(xù)費(fèi)。很自然的我用了ng-model和ng-change,并且一般情況下沒(méi)什么問(wèn)題。問(wèn)題是:輸入框下還有一個(gè)按鈕是全部賣出,點(diǎn)擊這個(gè)按鈕程序會(huì)自動(dòng)設(shè)置...

    Forelax 評(píng)論0 收藏0
  • @angular/forms 源碼解析之 Validators

    摘要:校驗(yàn)器運(yùn)行完成后,會(huì)設(shè)置屬性,從而計(jì)算的屬性,假設(shè)校驗(yàn)錯(cuò)誤,則屬性值為。這樣就理解了校驗(yàn)器的整個(gè)運(yùn)行過(guò)程,也包括為何校驗(yàn)錯(cuò)誤時(shí)會(huì)自動(dòng)添加描述控件狀態(tài)的。 我們知道,@angular/forms 包主要用來(lái)解決表單問(wèn)題的,而表單問(wèn)題非常重要的一個(gè)功能就是表單校驗(yàn)功能。數(shù)據(jù)校驗(yàn)非常重要,不僅僅前端在發(fā)請(qǐng)求給后端前需要校驗(yàn)數(shù)據(jù),后端對(duì)前端發(fā)來(lái)的數(shù)據(jù)也需要校驗(yàn)其有效性和邏輯性,尤其在存入數(shù)據(jù)庫(kù)...

    JowayYoung 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<