从AngularJS中的$ apply或$ digest循环中的指令更新模型

时间:2013-08-03 18:36:22

标签: javascript angularjs angularjs-directive angularjs-scope

我尝试从指令更新模型,并且当$ apply或$ digest正在进行时遇到一些麻烦。我有一些问题:

  1. 为什么scope[attrs.ngModel]存在,但ngModel.$modelValue不存在 存在于$ apply阶段?
  2. 为什么在$ digest阶段(尤其是在困难的情况下)不能始终更新视图?
  3. 在我的例子中是$ digest阶段本地$ digest()或$ root。$ digest()(来自$ apply())吗?
  4. require: '?ngModel',
    link: function(scope, element, attrs, ngModel) {
    
      element.bind('myEvent', function(e) {        
        //Update model from directive in phase:               $apply  |  $digest
    
        scope[attrs.ngModel].value = scope.$$phase; //Model: '$apply' | '$digest'
        //or
        ngModel.$modelValue.value  = scope.$$phase; //Model: 'none'   | '$digest'
        //or
        ngModel.$modelValue.value  = scope.$$phase; //Model: ''       | '$digest'
        ngModel.$setViewValue(ngModel.$modelValue);
      });
    }
    

    现场演示:http://plnkr.co/edit/gVY6GJejEKCLdTIXNAzK?p=preview

1 个答案:

答案 0 :(得分:2)

  1. 多数民众赞成因为角度不知道如何将模型映射到您的DIV元素。 angular有几乎所有INPUT(除了INPUT类型文件),SELECT和TEXTAREA元素的内置模型实现。 在您的情况下(具有应用的ng模型的DIV),没有已知角度的匹配模型适配器。 DIV元素的属性/属性应采用角度与模型同步?这就是为什么你没有应用$ modelValue。 您需要做的是为角度提供自定义模型适配器,或者您需要使用INPUT,SELECT或TEXTAREA元素。

  2. 因为在$ digest阶段,angular假设所有更改都已完成。

  3. 没有本地或全球$ digest阶段。阶段始终与您的ng-app相关联。