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

  • 为什么 scope[attrs.ngModel] 存在,但 ngModel.$modelValue 不存在
    存在于 $apply 阶段?
  • 为什么 View 在 $digest 阶段不能总是更新(特别是在困难的情况下)?
  • 在我的例子中,$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

    最佳答案

  • 那是因为 angular 不知道如何将模型映射到您的 DIV 元素。 angular 具有几乎所有 INPUT(INPUT 类型文件除外)、SELECT 和 TEXTAREA 元素的内置模型实现。
    在您的情况下(具有应用的 ng-model 的 DIV)没有已知的 angular 匹配模型适配器。 DIV 元素的什么属性/属性应该采用 Angular 与您的模型同步?这就是为什么你没有应用 $modelValue 的原因。
    您需要做的是为 angular 提供自定义模型适配器,或者您需要使用 INPUT、SELECT 或 TEXTAREA 元素。
  • 因为在 $digest 阶段 angular 假设所有更改都已完成。
  • 没有本地或全局 $digest 阶段。阶段始终与您的 ng-app 相关联。
  • 关于javascript - 从 AngularJS 中的 $apply 或 $digest 循环中的指令更新模型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18036015/

    10-12 06:55