Директива AngularJs изменяет ngModel с задержкой и значением модели не соответствует

Ng-change ведет себя странно в директиве. Кажется, есть задержка в цикле дайджеста, что приводит к неправильному (предыдущему) значению ngModel в контроллере сразу после изменения.

ngModel : '='

https://codepen.io/anon/pen/moEgdG

Что происходит и как исправить?


person What Ever    schedule 04.03.2019    source источник
comment
Вы можете передать правильное значение функции changer() и приравнять к нему ngModel. Но это не кажется правильным.   -  person What Ever    schedule 04.03.2019
comment
Да, двусторонняя привязка (=) создает наблюдатель, который передает данные из родительской области в изолированную область директивы. Для этой передачи требуется цикл дайджеста. Так работает фреймворк AngularJS.   -  person georgeawg    schedule 04.03.2019
comment
да, но почему кажется, что у него задержка?   -  person What Ever    schedule 05.03.2019


Ответы (1)


С директивой ng-model для компонента я рекомендую использовать односторонний (<) ввод и $setViewValue на выходе:

app.directive('newTag', function(){
  return {
    template: `
       <input ng-model="test" ng-change="change(test)"> <br/>
       {{test}}
    `,
    restrict: 'E',
    require: "ngModel",  
    scope: {
        ngModel : '<',
    },
    link: function (scope, elem, attrs, ngModel) {
      scope.change = function(val) {
        ngModel.$setViewValue(val);
      };
    },
  };
})

Использование:

<new-tag ng-model="tagValue" ng-change("newTagUpdate(tagValue)")>
</new-tag>

Для получения дополнительной информации см.

person georgeawg    schedule 04.03.2019
comment
вероятно, будет работать в angularjs 1.5+ и подходит для перехода на angular2, но что делать в более старых версиях? - person What Ever; 05.03.2019
comment
ng-change("newTagUpdate(tagValue)") Как я уже огорчился, я могу сделать это и в двухстороннем связывании, но какой тогда смысл в двухстороннем связывании?! - person What Ever; 05.03.2019
comment
Чтобы упростить переход на Angular +2, компоненты должны избегать двусторонней привязки. Для получения дополнительной информации см. Справочник разработчика AngularJS — Архитектура приложения на основе компонентов - person georgeawg; 05.03.2019