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

Update model from directive from $apply or $digest cycle in AngularJS

本文关键字:指令 更新 模型 循环 AngularJS apply 根据 digest      更新时间:2023-09-26

我尝试从指令更新模型,但在$apply或$digest已经在进行时遇到了一些问题。我有一些问题:

  1. 为什么scope[attrs.ngModel]存在,而ngModel.$modelValue不存在是否存在于$apply阶段
  2. 为什么视图不能总是在$digest阶段更新(尤其是在困难的情况下)
  3. 是$digest阶段的本地$digest()或$root$digest()(来自$appley())
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. 这是因为angular不知道如何将模型映射到DIV元素。angular几乎为任何INPUT(INPUT类型文件除外)、SELECT和TEXTAREA元素都内置了模型实现。在您的情况下(应用ng模型的DIV),没有已知的angular匹配模型适配器。DIV元素的哪个属性/属性应该采用angular才能与您的模型同步??这就是为什么没有应用$modelValue。您要做的是为angular提供一个自定义模型适配器,或者您需要使用INPUT、SELECT或TEXTAREA元素。

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

  3. 不存在本地或全局$digest阶段。阶段总是与你的ng应用程序相关联。