2016-07-29 67 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]是窗體控制器等。