我正在使用 Angular 开发一个大型应用程序,我需要使用 $rootscope.$emit 启动一个事件,并在工厂内监听此事件。我无法在 Controller 内执行此操作,因为当我初始化用户时, Controller 尚未加载。
该代码有效,但我想知道这是否是最好的方法。
工厂一,发出事件:
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
已经位于顶部。因此它将仅用于通知绑定(bind)到 $rootScope
的事件。
我建议直接通过注入(inject)来调用工厂方法,如下所示:
替换 $rootScope.$emit('initUser', userData);
通过在 AuthenticationService
中注入(inject) manageUser
工厂来使用 manageUser.initUser();
。
由于性能成本,事件是最不受欢迎的。
关于javascript - $rootScope.$emit 和 $on,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36080897/