Javascript 正确使用$emit方法显示模态
我想知道如何正确地使用Javascript 正确使用$emit方法显示模态,javascript,angularjs,Javascript,Angularjs,我想知道如何正确地使用$emit方法,以便在我的错误回调中触发模态 我有以下工厂: angular.module('BBPlnkr').factory("Session", [ '$http', '$q', '$rootScope', function($http, $q, $rootScope) { var service; service = { requestCurrentUser: function() { if (service.isAu
$emit
方法,以便在我的错误回调中触发模态
我有以下工厂:
angular.module('BBPlnkr').factory("Session", [
'$http', '$q', '$rootScope', function($http, $q, $rootScope) {
var service;
service = {
requestCurrentUser: function() {
if (service.isAuthenticated()) {
return $q.when(service.currentUser);
} else {
}
return $http.get('current_user').then(function(resp) {
console.log(resp.data);
service.currentUser = resp.data;
return service.currentUser;
}, function(resp) {
if (resp.status === 401) {
$rootScope.$emit("loginRequired", "err");
console.log('You are not authetnicated');
}
});
},
currentUser: null,
isAuthenticated: function() {
return !!service.currentUser;
}
};
return service;
}
]);
该工厂只需检查用户是否为当前用户,如果不是,则返回401。我想做的是在调用这个错误回调时,在这个错误回调内部触发一个模态。现在我发现我可以使用$emit
方法,但不确定是否正确使用了它。在错误回调中,我希望通过作用域链向上调度事件。这就是$emit
正确的做法。但是我不能完全确定我是否正确设置了这个。所以在这样做的时候。我的控制器是这样的:
myApp.controller('MainController', ['$scope', '$rootScope', '$modal', '$location', '$route', function($scope, $rootScope, $modal, $location, $route) {
$rootScope.$on('loginRequired', function(event, second_param){
/* Do the modal stuff here??*/
});
}
]);
我知道我实际上没有做任何事情来触发模态($modal.open)。但我想知道我是否朝着正确的方向前进。如果没有,一些建议将是有益的。我在网上查找了有关$emit
,$broadcast
的文档。我知道两者的区别。一旦在作用域链上分派事件,一个在$scope链下分派事件。选项1
angular.module('BBPlnkr').factory("Session", [
'$http', '$q', '$rootScope','$scope', function($http, $q, $rootScope,$scope) {
var service;
service = {
requestCurrentUser: function() {
if (service.isAuthenticated()) {
return $q.when(service.currentUser);
} else {
}
return $http.get('current_user').then(function(resp) {
console.log(resp.data);
service.currentUser = resp.data;
return service.currentUser;
}, function(resp) {
if (resp.status === 401) {
$scope.$emit("loginRequired", "err");
console.log('You are not authetnicated');
}
});
},
currentUser: null,
isAuthenticated: function() {
return !!service.currentUser;
}
};
return service;
}
]);
选择2
myApp.controller('MainController', ['$scope', '$rootScope', '$modal', '$location', '$route', function($scope, $rootScope, $modal, $location, $route) {
$rootScope.loginRequired = fn(){}
}
]);
angular.module('BBPlnkr').factory("Session", [
'$http', '$q', '$rootScope', function($http, $q, $rootScope) {
var service;
service = {
requestCurrentUser: function() {
if (service.isAuthenticated()) {
return $q.when(service.currentUser);
} else {
}
return $http.get('current_user').then(function(resp) {
console.log(resp.data);
service.currentUser = resp.data;
return service.currentUser;
}, function(resp) {
if (resp.status === 401) {
$rootScope.loginRequired()
console.log('You are not authetnicated');
}
});
},
currentUser: null,
isAuthenticated: function() {
return !!service.currentUser;
}
};
return service;
}
]);
但我认为您过度使用了根作用域以及emit和broadcast的作用域
$scope.showDialog=true一样简单代码>从控制器中
希望对您有所帮助。$rootScope位于顶部,因此您希望使用$broadcast发送。感谢您的详细解释。然而。。。选择1。我确信您无法在工厂级别访问$scope
。此外,他还指出建议:使用$rootScope。$emit+$rootScope。$此外,$emit
的使用会通过作用域层次结构向上发送事件名称,通知注册用户。因此,使用$emit
而不是$broadcast
是否明智?使用$broadcast
的最初建议是可行的。在我的控制器中,我执行$scope.on('loginRequired,function(){console.log'something})代码>哪个有效