4

Я пытаюсь обновить модель из директивы и имею некоторые проблемы, когда $ apply или $ digest уже выполняется. И у меня есть несколько вопросов:

  1. Почему scope[attrs.ngModel] будет существовать, но ngModel.$modelValue не существуют в $ применять фазу?
  2. Почему просмотр может не всегда обновляться в фазе $ digest (особенно в сложных ситуациях)?
  3. Является ли $ digest фазой локальным $ digest() или $ root. $ Digest() (из $ apply()) в моем примере?
require: '?ngModel', 
link: function(scope, element, attrs, ngModel) { 

    element.bind('myEvent', function(e) {   
    //Update model from directive in phase:    $apply | $digest 

    scope[attrs.ngModel].value = scope.$$phase; //Model: '$apply' | '$digest' 
    //or 
    ngModel.$modelValue.value = scope.$$phase; //Model: 'none' | '$digest' 
    //or 
    ngModel.$modelValue.value = scope.$$phase; //Model: ''  | '$digest' 
    ngModel.$setViewValue(ngModel.$modelValue); 
    }); 
} 

Живая демонстрация: http://plnkr.co/edit/gVY6GJejEKCLdTIXNAzK?p=preview

ответ

2
  1. Это потому, что угловая does'nt узнать, как отобразить модель в вашем DIV элемента. У угловых встроенных реализаций модели практически для любого INPUT (кроме файла типа INPUT), элемента SELECT и TEXTAREA. В вашем случае (DIV с применением ng-модели) нет подходящего адаптера модели, известного угловым. какое свойство/атрибут элемента DIV должно быть угловатым для синхронизации с вашей моделью? Вот почему у вас нет $ modelValue. вам нужно сделать так, чтобы пользовательский адаптер модели был угловатым или вам нужно использовать элемент INPUT, SELECT или TEXTAREA.

  2. потому что в угловой фазе $ digest предполагается, что все изменения выполнены.

  3. не существует локальной или глобальной фазы $ digest. фазы всегда связаны с вашим ng-приложением.

+0

Как я могу создать и предоставить пользовательский адаптер модели? Или посоветуйте пожалуйста подходящую статью. Как я могу изменить модель в фазе $ digest, если угловой предполагает, что все изменения сделаны? Теперь я использую область действия. $$ phase || scope. $ apply, но это плохой способ, я думаю ... – tamtakoe

+1

Я действительно уверен, что ваш пример кода и вопрос не отражают вашу реальную проблему. что вы делаете в своем коде ... почти неправильно, во всяком случае, что вы хотите сделать, и я сожалею, что это действительно :-) если вы хотите сохранить свой код «как есть», то единственным выбором, который у вас есть, является проверка текущая фаза и в случае, если она НЕ применяется «$ apply»: оберните свой сеттер значений в пределах области. $ apply (function() {scope [attrs.ngModel] .value = "все, что вы хотите";}), чтобы перезапустить применение нового значения , Но, как я уже сказал, вы должны пересмотреть свой примерный код, чтобы показать, что вы * ДЕЙСТВИТЕЛЬНО хотите *. – lgersman

Смежные вопросы