触发ng-model.$ formatters以编程方式运行

Sim*_*lGy 8 javascript angularjs angular-ngmodel

我想要一个自定义控件,用于ngModel.$formatters在服务器依赖项加载后立即格式化数据.在我的情况下,它需要加载查找表以从一种id转到另一种id.$modelValue商店一件事$viewValue显示另一件事.相当直接的东西.

诀窍是,如果我的查找表没有加载,我不能格式化为$ viewValue.

加载数据后,我需要执行以下操作:

  • ngModel.$formatters.push(myFormatter)
  • 告诉ngModel从中启动管道 $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.
});
Run Code Online (Sandbox Code Playgroud)

Joe*_*ger 6

查看ngModelController的代码,看起来你偶然发现的$modelValue东西(设置为当前实际模型值以外的任何东西)是可接受的方法.如您所说,未设置您设置的值:它只是触发更新.首先检查其当前值以确保它实际更改(或使用非常不可能的值).

if (ngModel.$modelValue == 'bar')
    ngModel.$modelValue = 'foo';
else
    ngModel.$modelValue = 'bar';
Run Code Online (Sandbox Code Playgroud)

这是一个相关的问题.

此外,还有一个活跃的拉取请求看起来像这样做的"官方"方式即将到来.

它的工作原理是ngModelController设置一个$watch运行每个摘要周期的运行,该运算周期与$modelValueng-model绑定的值进行比较.如果它们不匹配,则触发$formatters管道.