Актуализирайте модела от директива от $apply или $digest цикъл в AngularJS

Опитвам се да актуализирам модела от директива и имам проблеми, когато $apply или $digest вече се изпълняват. И аз имам няколко въпроса:

  1. Защо scope[attrs.ngModel] съществува, но ngModel.$modelValue не съществува във фазата на $apply?
  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


person tamtakoe    schedule 03.08.2013    source източник


Отговори (1)


  1. Това е така, защото angular не знае как да картографира модела към вашия DIV елемент. angular има вградени реализации на модела за почти всеки INPUT (с изключение на файл тип INPUT), SELECT и TEXTAREA елемент. Във вашия случай (DIV с приложен ng-модел) няма съответстващ модел адаптер, известен на angular. какво свойство/атрибут на елемента DIV трябва да приема angular, за да бъде в синхрон с вашия модел?? ето защо нямаме приложен $modelValue. това, което трябва да направите, е да предоставите персонализиран модел адаптер към angular ИЛИ трябва да използвате елемент INPUT, SELECT или TEXTAREA.

  2. тъй като във фазата на $digest angular приема, че всички промени са направени.

  3. няма локална или глобална $digest фаза. фазите винаги са свързани с вашето ng-приложение.

person lgersman    schedule 16.08.2013
comment
Как мога да създам и осигуря персонализиран модел адаптер? Или посъветвайте подходяща статия. Как мога да променя модела във фаза $digest, ако angular предполага, че всички промени са направени? Сега използвам scope.$$phase || scope.$apply, но това е лош начин, според мен... - person tamtakoe; 17.08.2013
comment
Наистина съм сигурен, че вашият пример за код и въпрос не отразяват истинския ви проблем. това, което правите във вашия код е ... почти грешно, така или иначе това, което искате да направите и съжалявам да го кажа, наистина :-) ако искате да запазите кода си, единственият избор, който имате, е да проверите текущата фаза и в случай, че НЕ е $apply : обвийте вашия инструмент за настройка на стойност в рамките на scope.$apply( function() { scope[attrs.ngModel].value = каквото искате; }), за да рестартирате прилагането на нова стойност. Но както казах - трябва да преосмислите своя примерен код, за да покажете какво НАИСТИНА искате. - person lgersman; 20.08.2013