2013-10-27 2 views
2

У меня есть угловая служба, которая управляет аутентификацией приложения. И контроллер.Область углового обновления от события

сервис срабатывает даже на $rootScope, когда пользователь входит в систему и выходит из системы.

Я хочу обновить элемент DOM в своем пользовательском интерфейсе, поэтому он отображает «Вход» или «Выход» в зависимости от состояния пользователя.

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

Вот мой текущий код.

app.service('AuthenticationService', function ($rootScope) { 

var _loggedIn = "false"; 

this.login = function (email, password) { 

    if (!email || !password) return 1; 
    else { 
     _loggedIn = "true"; 
     // broadcast on root scope, so anyone can listen 
     $rootScope.$broadcast("loginChanged", 1); 
     return 0; 
    } 
}; 

this.logout = function (email, password) { 
    _loggedIn = "false"; 
    // broadcast on root scope, so anyone can listen   
    $rootScope.$broadcast("loginChanged", 0); 

} 
/*other functions ommited*/ 
}); 

И в мой контроллер

var addListener = function() { 
    listener = $scope.$on("loginChanged", function (e, loggedIn) { 
     $scope.loginButton.text = loggedIn ? "Log Out" : "Log In"; 
     $scope.loginButton.link = loggedIn ? "#/logout" : "#/login"; 

     console.log("loginChanged: " + loggedIn); 
    }); // $on returns a registration function for the listener 
}; 

Издание является то, что console.log(...) работает отлично, хотя обновление $ область не отражается в пользовательском интерфейсе. Я попробовал обернуть его в $scope.$apply, который вызвал ошибку, заявив, что применение уже выполняется.

Как обновить пользовательский интерфейс от события? есть ли лучший/более стандартный способ добиться того же?

Thanks In Advance

+0

предоставить демоверсию, которая реплицирует проблему. Похоже, что может быть какая-то вложенность, которая может вызвать проблему наследования сферы. Трудно помочь без разметки. Если журнал работает ... проблема в другом месте – charlietfl

+0

Покажите, как вы интегрируете переменную 'loginButton' в HTML – Chandermani

+0

. Кнопка входа находится в HTML как это ' {{loginButton.text}} ' – Madushan

ответ

3

Ваш код просто отлично работает. Вот плункер: http://plnkr.co/edit/BUOAUgOe1y3e6S2Dq6dW?p=preview

Но я бы не использовал $ brodcast для уведомления об изменениях. Это похоже на то, что вы используете глобальное пространство имен глобальными переменными. Я бы порекомендовал прохождение в Службе и прослушивание изменений в этой службе. Я создал плункер, чтобы показать вам, что я имею в виду: http://plnkr.co/edit/MCWThc1ZtaAxmZSTirT6?p=preview

+0

confusing' _loggedIn' с аргументом данных 'loggedIn', используемым в' $ вещание ", которое выглядит как числовое – charlietfl

+0

Вы правы. Перепутал себя, реорганизовывая исходный код, чтобы не использовать $ broadcast и не думал, что это за ошибка. Обновит мой ответ. Ty – bekite

+0

меньше накладных расходов, используя $ broadcast, чем $ watch – charlietfl

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