我想要一个自定义控件,使用ngModel.$formatters
能够在服务器依赖项加载后立即格式化数据。在我的情况下,它需要加载一个查找表来从一种id到另一个。 $modelValue
存储一件事$viewValue
显示另一件事。很直接的东西。
诀窍是如果我的查找表没有加载,我就无法将格式化为$ viewValue。
加载数据后,我需要执行以下操作:
ngModel.$formatters.push(myFormatter)
$modelValue -> $formatters -> $viewValue
$render()
不起作用,这只会将值从$viewValue
移到UI控件中。
$rollbackViewValue()
看起来很有希望,但这只是在一个不稳定的版本中(1.3.0-beta.18)。
代码示例:
mappingTable.load().then(function(data){
mappingData = data;
ngModel.$formatters.push(myFormatter); // needs mappingData in order to function
// TODO: Tell ngModel to run the existing $modelValue through $formatters to calculate a new $viewValue and $render it
//ngModel.$render() // doesn't work, only puts the $viewValue in the DOM element.
});
答案 0 :(得分:6)
查看ngModelController的代码,看起来你偶然发现的事情(将$modelValue
设置为当前实际模型值以外的任何内容)是可接受的方法。如您所说,未设置您设置的值:它只是触发更新。首先检查其当前值以确保它实际更改(或使用非常不可能的值)。
if (ngModel.$modelValue == 'bar')
ngModel.$modelValue = 'foo';
else
ngModel.$modelValue = 'bar';
此外,还有一个active pull request看起来像是“官方”的方式即将到来。
它的工作原理是ngModelController设置一个$watch
,它运行每个摘要周期,将$modelValue
与ng-model绑定的值进行比较。如果它们不匹配,则会触发$formatters
管道。