2016-07-29 6 views
0

親スコープの変数を変更する必要があるため、ngModelディレクティブは新しいスコープを作成すべきではないと思います。
私が間違っている場合は私を修正してください。
また、ngModelディレクティブスコープのソースを見ると定義されていないので、ディレクティブの新しいスコープを作成すべきではありません。
AngularJSのngModelディレクティブの範囲は何ですか?

var ngModelDirective = ['$rootScope', function($rootScope) { 
    return { 
    restrict: 'A', 
    require: ['ngModel', '^?form', '^?ngModelOptions'], 
    controller: NgModelController, 
    // Prelink needs to run before any input directive 
    // so that we can set the NgModelOptions in NgModelController 
    // before anyone else uses it. 
    priority: 1, 
    compile: function ngModelCompile(element) { 
     // Setup initial state of the control 
     element.addClass(PRISTINE_CLASS).addClass(UNTOUCHED_CLASS).addClass(VALID_CLASS); 

     return { 
     pre: function ngModelPreLink(scope, element, attr, ctrls) { 
      var modelCtrl = ctrls[0], 
       formCtrl = ctrls[1] || modelCtrl.$$parentForm; 

      modelCtrl.$$setOptions(ctrls[2] && ctrls[2].$options); 

      // notify others, especially parent forms 
      formCtrl.$addControl(modelCtrl); 

      attr.$observe('name', function(newValue) { 
      if (modelCtrl.$name !== newValue) { 
       modelCtrl.$$parentForm.$$renameControl(modelCtrl, newValue); 
      } 
      }); 

      scope.$on('$destroy', function() { 
      modelCtrl.$$parentForm.$removeControl(modelCtrl); 
      }); 
     }, 
     post: function ngModelPostLink(scope, element, attr, ctrls) { 
      var modelCtrl = ctrls[0]; 
      if (modelCtrl.$options && modelCtrl.$options.updateOn) { 
      element.on(modelCtrl.$options.updateOn, function(ev) { 
       modelCtrl.$$debounceViewValueCommit(ev && ev.type); 
      }); 
      } 

      element.on('blur', function() { 
      if (modelCtrl.$touched) return; 

      if ($rootScope.$$phase) { 
       scope.$evalAsync(modelCtrl.$setTouched); 
      } else { 
       scope.$apply(modelCtrl.$setTouched); 
      } 
      }); 
     } 
     }; 
    } 
    }; 
}]; 


ngModelディレクティブはngModel自体を必要とする理由も、私は理解していません。
が必要です:[ 'ngModel'、 '^フォーム?'、 '^ ngModelOptions?']
が必要のよう はそれを無視して書き込むことができません:[ '^フォーム?'、 '^ ngModelOptions?' ]

そうでない場合は、理由を説明してください。

答えて

1

ngModelは分離スコープを作成しません。 ngModelがrequire配列にリストされているのは、コントローラ(NgModelController)がリンク関数に挿入されるためです。 ngModelPostLink関数に渡されるctrls引数に注目してください。 ngModelが配列にリストされているので、ctrls [0]はNgModelControllerのインスタンスになります。 ctrls [1]はフォームコントローラなどです

関連する問題