[英]$rootScope.$emit and $on
我正在使用Angular開發一個大型應用程序,並且需要使用$ rootscope。$ emit啟動一個事件,並在工廠中收聽此事件。 我無法在控制器內部執行此操作,因為當我初始化User時,該控制器尚未加載。
該代碼有效,但是我想知道這是否是最好的方法。
發出事件的工廠一:
angular
.module('app.core')
.factory('AuthenticationService', ['$rootScope', 'requestHttpService', AuthenticationService])
function AuthenticationService($rootScope, requestHttpService) {
var isLoggedIn = false;
return {
logIn: logIn
}
function logIn(action) {
return requestHttpService.runOpenRequest(action)
.then(logInComplete)
.catch(logInError);
function logInComplete(userData) {
$rootScope.$emit('initUser', userData);
}
function logInError(error) {
console.log('Something went wrong: ' + error);
}
}
};
還有第二家工廠,它們監聽事件:
angular
.module('app.user')
.factory('manageUser', ['$rootScope', manageUserFactory]);
function manageUserFactory($rootScope) {
var user = {'id': '', 'name': ''};
$rootScope.$on('initUser', function (event, userData) {
initUser(userData);
});
return {
initUser: initUser
}
function initUser(userData) {
user = {'id': userData.id, 'name': userData.name};
}
};
我建議不要在這里使用事件。
當您使用$ emit時,$ emit在范圍層次結構中向上移動,包括發出它的當前范圍,在此示例中, $rootScope
已經在頂部。 因此,它將僅用於通知綁定到$rootScope
事件。
我建議通過如下注入直接調用工廠方法:replace $rootScope.$emit('initUser', userData);
與manageUser.initUser();
通過在AuthenticationService
注入manageUser
工廠。
最不推薦使用事件,因為它們的執行成本很高。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.