AngularJS $ Location.Path In Service

时间:2015-01-12 20:53:58

标签: javascript angularjs

我有一个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();
        };
    }]);

}());

0 个答案:

没有答案