我有一个AngularJS应用程序,当事件发生时需要导航到不同的模板。用户单击当前AngularJS模板上的按钮可以触发此事件,也可以由定期调用Web服务检查事件的AngularJS服务触发。
这个AngularJS应用程序实际上有很多这样的事件,所以我创建了一个AngularJS服务来封装触发事件时应该发生的事情的逻辑。它具有每个事件的功能,AngularJS控制器或AngularJS服务在事件触发时调用此函数。
问题是当我致电$location.path
导航到新模板时。如果从控制器调用它,则应用程序已在进行中。但是,从AngularJS服务调用它然后申请将不会正在进行中,我将需要致电$rootScope.$apply
。
我的问题是,如何判断何时需要拨打$rootScope.$apply
以及何时不应该?我查看了这个网站https://coderwall.com/p/ngisma/safe-apply-in-angular-js,它从控制器传递$scope
并查看控制器范围内的$$phase
对象,以确定是否正在进行应用。但是,当我从另一个AngularJS服务中调用它时,我将无法传入控制器$scope
,因此它对我不起作用。
我该如何使这项工作?或者我是以错误的方式接近这个?
这里有一些代码可以帮助解释我的意思。该代码显示了名为' eventsSrv'的AngularJS服务。具有响应事件的逻辑。 ' eventsSrv'使用名为' monSrv'我没有显示代码。 ' monSrv'负责获取服务器事件(通过Web套接字或轮询Web服务)。 ' eventsSrv'使用' monSrv'知道服务器何时触发“退出”#39;事件
该代码还显示了一个调用'退出'功能在' eventsSrv'。在这个简化的例子中,拉出'退出'逻辑分离服务,但在现实生活中,事件有更多的逻辑,可以从各种控制器调用。
以下代码适用于“monSrv”引发服务器端事件的情况。服务。但是,当控制器调用它时它不起作用,因为它说并且$ apply已经在进行中。
(function () {
'use strict';
var demoApp = angular.module('demoApp');
demoApp.factory('eventsSrv', ['$rootScope', 'monSrv', '$location', function ($rootScope, monSrv, $location) {
factory.exit = function () {
$rootScope.$apply(function () {
$location.path('/exit');
});
};
monSrv.onExit(function (event) {
factory.exit();
});
monSrv.startListening();
return factory;
}]);
demoApp.controller('menuCtrl', ['$scope', 'eventsSrv', function ($scope, eventsSrv) {
$scope.exit = function () {
eventsSrv.exit();
};
}]);
}());