看到这个小提琴:
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 上公开公开的函数?
好吧,我想人们可以将该块复制到指令中。 都是公开的东西。 不过,如果有一个功能可以为你做这件事会很方便。
+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
最有用的评论
+1 有这个真的很好。 缺少异步格式化程序和解析器使得处理异步数据非常麻烦。 这将有助于防止针对异步数据源的同步验证引入的某些竞争条件。
作为参考,我的做法与@jpsimons非常相似: