Angular.js: NgModel 需要一种手动重新运行格式化程序链的方法

创建于 2013-07-31  ·  3评论  ·  资料来源: angular/angular.js

看到这个小提琴:
http://jsfiddle.net/tPWBK/1/

假设您有一个需要“ngModel”并添加到格式化程序和解析器链的数据转换指令。 如果转换依赖于 $modelValue 或 $viewValue 以外的某些动态数据,则无法监视该数据并重新运行格式化程序链。

请参阅https://github.com/angular/angular.js/blob/master/src/ng/directive/input.js#L1081 的摘录

$scope.$watch(function ngModelWatch() {
  var value = ngModelGet($scope);

  // if scope model value and ngModel value are out of sync
  if (ctrl.$modelValue !== value) {

    var formatters = ctrl.$formatters,
        idx = formatters.length;

    ctrl.$modelValue = value;
    while(idx--) {
      value = formatters[idx](value);
    }

    if (ctrl.$viewValue !== value) {
      ctrl.$viewValue = value;
      ctrl.$render();
    }
  }
});

(ctrl.$modelValue !== value) 检查中的所有内容是否应该是在 NgModelController 上公开公开的函数?

forms feature

最有用的评论

+1 有这个真的很好。 缺少异步格式化程序和解析器使得处理异步数据非常麻烦。 这将有助于防止针对异步数据源的同步验证引入的某些竞争条件。

作为参考,我的做法与@jpsimons非常相似:

scope.$watch('myAsyncCollection', () => {
  ngModel.$viewValue = ngModel.$formatters.reduceRight((prev, fn) => fn(prev)), ngModel.$modelValue)
  ngModel.$render()
})

所有3条评论

好吧,我想人们可以将该块复制到指令中。 都是公开的东西。 不过,如果有一个功能可以为你做这件事会很方便。

+1 有这个真的很好。 缺少异步格式化程序和解析器使得处理异步数据非常麻烦。 这将有助于防止针对异步数据源的同步验证引入的某些竞争条件。

作为参考,我的做法与@jpsimons非常相似:

scope.$watch('myAsyncCollection', () => {
  ngModel.$viewValue = ngModel.$formatters.reduceRight((prev, fn) => fn(prev)), ngModel.$modelValue)
  ngModel.$render()
})

如果有人正在搜索代码片段 - 它已经移动:
https://github.com/angular/angular.js/blob/master/src/ng/directive/ngModel.js#L822

此页面是否有帮助?
0 / 5 - 0 等级