4

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

  1. 为什么scope[attrs.ngModel]存在,但ngModel.$modelValue在 $apply 阶段不存在?
  2. 为什么视图不能总是在 $digest 阶段更新(尤其是在困难的情况下)?
  3. 在我的示例中,$digest 阶段是本地 $digest() 还是 $root.$digest()(来自 $apply())?
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

4

1 回答 1

2
  1. 那是因为 Angular 不知道如何将模型映射到您的 DIV 元素。angular 具有几乎所有 INPUT(INPUT 类型文件除外)、SELECT 和 TEXTAREA 元素的内置模型实现。在您的情况下(具有应用 ng-model 的 DIV),没有已知的 angular 匹配模型适配器。DIV 元素的哪些属性/属性应该与您的模型同步?这就是为什么您没有应用 $modelValue 的原因。您需要做的是为 angular 提供自定义模型适配器,或者您需要使用 INPUT、SELECT 或 TEXTAREA 元素。

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

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

于 2013-08-16T09:34:07.150 回答