Angularjs. Почему изменения на странице происходят только после $apply?

Есть 2 инпута

<input type="text" class="search-input real-search-input" data-ng-hide="showFakeInput"/>
<input type="text" class="search-input fake-search-input " disabled="disabled" data-ng-show="showFakeInput" />


В контроллере слушаются события. Сами события вызываются из директивы.
$scope.showFakeInput = false; 

$rootScope.$on('showFakeSearchInput', function () {
      $scope.showFakeInput = true;
});

$rootScope.$on('hideFakeSearchInput', function () {
     $scope.showFakeInput = false;            
});


При первом вызовы события 'showFakeSearchInput' все работает прекрасно. Первый инпут ('.real-search-input') исчезает, и .fake-search-input появляется.

А вот если потом вызвать 'hideFakeSearchInput', то изменений не происходит. Т.е переменная меняется, но .real-search-input остается скрытым, а .fake-search-input остается видимым.

Если сделать так
$rootScope.$on('hideFakeSearchInput', function () {
     $scope.showFakeInput = false;        
     $scope.$apply();    
});

То все работает как надо.

Почему так происходит и можно ли обойтись без $apply ?
  • Вопрос задан
  • 2836 просмотров
Пригласить эксперта
Ответы на вопрос 4
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Вы не поняли как работает дата-биндинг в ангуляре. То есть тот самый краеугольный камень, на котором держится ангуляр вы и не поняли.

$apply вызывает у rootScope $digest-цикл, в котором сравнивается текущее значение и последнее сохраненное. При наличии изменений - запускается ватчер.

Так что краткий ответ - нет, без $apply ничего работать не будет. Длинный ответ - www.sitepoint.com/understanding-angulars-apply-digest
Ответ написан
@andreyzenkov
javascript developer
Почитайте - habrahabr.ru/post/201832 , очень хорошо разжевано.
Ответ написан
ByKraB
@ByKraB Автор вопроса
читаю вот это
ata binding means that when you change something in the view, the scope model automagically updates. Similarly, whenever the scope model changes, the view updates itself with the new value


У меня все выполняется в контексте, т.е в контроллере, используются стандартные директивы ng-show, ng-hide. Почему я должен вызывать $apply, если я использую только стандартные директивы Angular и вне Angular ничего не меняю?
Ответ написан
Комментировать
AMar4enko
@AMar4enko
Покажите вызов события из директивы. Предполагаю, что проблема там.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы