4

Angular.js ngModel能够声明一个parsersformatters的链。一些更多的细节可以在great answer to 'How to do two-way filtering in angular.js?'如何使用ngModel在angularjs指令中手动重新运行格式化程序链?

现在只有在ngModel将更新时才会运行格式化程序链。 因此,如果您有第二个影响viewValue的输入参数(在其中一个格式化程序中使用),这将不会触发View的更新。 类似,据我发现ngModel只使用一个简单的$ watch - 所以如果你的模型是一个集合/对象,它将不会触发,如果子元素被改变。

什么是实施ngModel了深刻的手表的最佳方式 -
或应该重新运行格式化链中的附加参数的手表?

还有其他类似的问题:
Angularjs: how to “rerun” $formatters when some setting is changed?

回答

4

目前还没有直接的API调用内部格式化链。 这里有一个github feature request。作为变通,你只可以复制的内部代码:

function runFormatters(ctrl){ 
    // this function is a copy of the internal formatter running code. 
    // https://github.com/angular/angular.js/issues/3407#issue-17469647 

    var modelValue = ctrl.$modelValue; 

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

    var viewValue = modelValue; 

    while (idx--) { 
     viewValue = formatters[idx](viewValue); 
    } 

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

     ctrl.$$runValidators(modelValue, viewValue, angular.noop); 
    } 

} 

this Plunker演示相结合的用法进行额外的参数表:

// deepwatch all listed attributes 
scope.$watch(
    function(){ 
     return [scope.extraThingToWatchFor, scope.someOther]; 
    }, 
    function() { 
     console.log("\t runformatters()"); 
     runFormatters(); 
    }, 
    true 
); 

this is a second Plunker证明上ngModel

// deepwatch ngModel 
scope.$watch(
    function(){ 
     return ngModelCtrl.$modelValue; 
    }, 
    function(newData) { 
     runFormatters(ngModelCtrl); 
    }, 
    true 
); 
的deepwatch
+0

这太神奇了! – Sabyasachi

相关问题