AngularJS:在控制器之间共享功能

时间:2016-03-29 01:25:31

标签: javascript angularjs angularjs-service

我在其他SO回答中读到,应该通过services访问不操纵视图的代码。但是,我有一个函数,我想通过几个Angular控制器共享,它可以访问$scope$rootScope$location

    $scope.selectBatch = function (id) {
        if (!id) {
            $scope.batchSelected = false;
            $rootScope.job = false;
            $scope.data = allData;
            $location.path('/', false);
        } else {
            $scope.batchSelected = id;
            $rootScope.job = {'BatchId': id};
            var arr = [];
            for (var i = 0; i < allData.length; i++) {

                if (String(allData[i].BatchId) === String(id)) {
                    arr.push(allData[i]);
                }
            }

            $scope.data = arr;
            $rootScope.go(id, 'batch');
        }
    };

理想情况下,在每个控制器中我都想做类似的事情:

 $scope.selectBatch = services.selectBatch($scope, $rootscope, $location);

从服务加载此功能,虽然这感觉“非角度”。

将这种功能注入多个控制器的“Angular”/ MVC方式是什么?

2 个答案:

答案 0 :(得分:0)

从这个问题的评论看来,正确的答案是这样做:

<强> 1。创建一个返回函数的服务

angular.module('myApp.services', []).service('shared', ['$location', function ($location) {

   this.selectBatch = function($rootScope, $scope){
      return function(id){
         // Do stuff with $location, id, $rootScope and $scope here
      }
   }

}]);

<强> 2。将服务和相关功能注入控制器

.controller('myCtrl', ['shared', '$scope', '$rootScope'
    function (shared, $scope, $rootScope) {

        $scope.selectBatch = shared.selectBatch($rootScope, $scope);

}]);

然后,您可以使用$scope.selectBatch(id)调用此函数,它可以按预期工作。

很高兴考虑其他答案,如果有更好的&#34;实现这一目标的方法。

答案 1 :(得分:0)

  

Angular服务是使用依赖注入(DI)连接在一起的可替换对象。您可以使用服务在整个应用中组织和共享代码。

您可以使用服务在整个应用中整理和分享代码

请注意,将$ scope作为参数发送到服务并不是一个好主意。相反,你可以发送函数所需的参数来处理某些事情。这样,您的服务可以更加重复使用。

检查此问题:Injecting $scope into an angular service function()

理想情况下,您可以编写如下共享服务:

app.factory('sharedService', ['$location', function($location)
{
    var sharedService = {};

    sharedService.selectBatch  = function(batchSelected, job, data, id)
    {
        //Do something with batchSelected, job, data, id parameters
    };

    return sharedService;
}]);

然后你的所有控制器都看起来像这样

app.controller('myCtrl', ['sharedService', function(sharedService)
{

    $scope.batchSelected;
    $scope.job;
    $scope.data;
    $scope.id;

    $scope.selectBatch = sharedService.selectBatch($scope.batchSelected, $scope.job, $scope.data, $scope.id);
}]);

注意

您也不必发送$ location参数,因为您可以将其注入共享服务中。