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