2013-05-24 2 views
0

Я столкнулся с необычным поведением с ng-switch, что я не могу понять. В верхней части моей страницы, у меня естьng-switch не обновляется автоматически

#content{"ng-switch" => "root.showAlert"} 
    %div.alert.ng-cloak#alert{"ng-switch-when" => "true"} 
    {{root.alert.message}} 
    %div.close 
     %a{:href => "#", "ng-click" => "dismissAlert()"} 
     =image_tag "icons/icon-close-black.png" 

В одном из моих контроллеров (высокий уровень) У меня есть следующие действия

$scope.displayAlert = function(message) { 
    $scope.root.alert = { 
    message: message 
    }; 
    $scope.root.showAlert = true; 

    if (!$scope.$$phase) { 
    $rootScope.$digest(); 
    } 
} 

$ scope.root определена в $ rootScope так доступен ко всему.

Когда я меняю флаг root.showAlert на значение true, я ожидаю увидеть предупреждение, поскольку оно должно смотреть эту переменную, однако это происходит не сразу, а вместо этого отображается, когда я изменяю что-то еще в приложении, выполняя любые другие действия.

При добавлении моего $rootScope.$digest() он работает и отображается сразу, но мне было интересно, почему он не сделает это сам по себе?

увольнении:

$rootScope.dismissAlert = function() { 
    $scope.root.showAlert = false; 
    delete $scope.root.alert; 
} 
+0

предоставьте функцию rejectAlert(). Моя ставка заключается в том, что вы получаете доступ к неправильной области. – Heinrich

+0

У меня нет проблем с отключением предупреждения, но только при его отображении. Но, как я уже сказал, он отображается, он просто принимает либо явный вызов дайджеста, либо какое-то другое действие для запуска – PaReeOhNos

+0

в порядке. Было бы неплохо увидеть фактический HTML. Может быть, больше пользователей смогут помочь, если вы можете отправлять HTML вместо haml. И во-вторых: угловой работает над этим результатом html, и если haml делает что-то странное в этот момент, я не мог знать. – Heinrich

ответ

2

Если вызов digest() вызывает что-то изменить в вашем пользовательском интерфейсе, что в противном случае не происходит, то это означает, что данные, влияющие, что пользовательский интерфейс изменяется в некотором асинхронном коде или какой-либо другой код который не был выполнен из собственного контекста AngularJS.

Всех основные действия, которые имеют место в Угловом встроенной функциональности (ng-click, $http обратных вызовов и т.д.) называют scope.$apply (который, в свою очередь, вызывает scope.$digest) на соответствующих сферах для распространения изменений во всей системе. Если вы меняете код из внешнего мира Angular, вам нужно обернуть функциональность в scope.$apply (или позвонить scope.$digest), чтобы сделать это самостоятельно.

Возможно, в этом случае, что Угловой работают дайджест от области, на которой крепятся кнопка, но так как вы chanigng данных о корневой сферы, вам нужно, чтобы начать дайджест себя.

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

+0

А это нормально. Таким образом, моя 'displayAlert' вызывается из обратного вызова сообщения websocket, которое, как мне кажется, выходит из углового мира. Итак, я должен обернуть вызов в области. $ Apply? – PaReeOhNos

+1

Просто испытал это, и он отлично работает :) Я предположил, что, поскольку мой обратный вызов находился в пределах углового контроллера, все было бы хорошо, но я полностью забыл, что метод вызывается извне области, поэтому он не знал о Это. Работая сейчас: D – PaReeOhNos

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