Средство форматирования Angular.js не запускается при изменении modelValue

http://plnkr.co/edit/HN1PBGRsK6xqT9pwXcKY?p=preview должно быть вполне самоочевидно

ctrl.$formatters запускается, когда я изначально устанавливаю значение модели, но не после его обновления.

В соответствии с этим $formatters вызывается при первом заполнении представления? он должен срабатывать каждый раз при изменении значения модели, так что же не так? Спасибо.


person fxck    schedule 18.04.2013    source источник


Ответы (1)


Используйте установщик естественной модели scope[attrs.ngModel] вместо setviewvalue.

app.directive('format', function($filter) {
  return {
    require: 'ngModel',
    link: function(scope, element, attrs, ctrl) {
    element.unbind('input').unbind('keydown').unbind('change');
        element.bind('blur', function() {
            if (element.val()) {
                scope.$apply(function() {
                    scope[attrs.ngModel] = element.val();
                });         
            }
        });

        ctrl.$formatters.unshift(function(modelValue) {
            if (modelValue) {
                var formatted = $filter('currency')(modelValue);
                return formatted;
            }
        });
    }
}
});

Вам также понадобится парсер, чтобы это работало правильно.

person Jonathan Rowny    schedule 18.04.2013
comment
Черт, а что, если ng-model — это что-то вроде ng-model=entry.test, хотя… это внутри ng-repeat, знаете ли… - person fxck; 18.04.2013
comment
просто выполните attrs.ngModel.split(.), а затем выполните итерацию по свойствам области - person roemer; 14.10.2014
comment
@foxx @roemer, тогда вы, вероятно, захотите добавить ngModel в изолированную область с помощью двунаправленной привязки, которая помещает ее в область, т.е. $scope.ngModel = ИЛИ вы можете сделать немного более хакерскую $scope.$eval(attrs.ngModel) - person Jonathan Rowny; 15.12.2014
comment
Что подразумевается под Вам также понадобится парсер, чтобы это работало корректно.? - person Luke Griffiths; 14.09.2016