AngularJS服务 - 在Controller中使用

时间:2014-01-07 17:27:01

标签: angularjs angularjs-scope angularjs-service angularjs-controller

我正在构建一个非常简单的应用程序,我有一个GlobalController(在body元素上),并且下面会有另一个子控制器。这是一个具有多个物理页面的模板化站点,这样子控制器将是不同的,但最多只有顶级全局一个和一个子一个。

我正在尝试创建全局函数,任何子控制器都可以使用它来运行每个需要运行的代码,而不必复制每个子控制器中的功能。

我可以做的一种方法是将$ rootScope和emit()消息包含在使用$ on()监听它们的GlobalController中。

我认为这不是一个“好”的方式来做到这一点。相反,我已经了解到为此使用服务更好。我现在仍然坚持如何实现这项服务。

我目前有一个像这样的全局控制器:

var globalModule = angular.module('DoSquareStuff', ["ngRoute","list", "savings-video"]); 
        // there will be a long list of modules that will be added after "savings-video"


globalModule.factory('squareMgr', function() {
    var squares = SUYS.squares;  // global obj with earned[] and placed[]

    return {
        getSquaresEarned: function() {
            return squares.earned;
        },
        getSquaresPlaced: function() {
            return squares.placed;
        },
        setThisSquareEarned: function(value) {
            squares.earned.push(value);
        },
        setThisSquarePlaced: function(value) {
            squares.placed.push(value);
        },
        earnedThisSquare: function(squareNum) {
            return ~squares.earned.indexOf(squareNum);
        },
        placedThisSquare: function(squareNum) {
            return ~squares.placed.indexOf(squareNum);
        }
    }
});

globalModule.controller('GlobalController', function($scope, $squareMgr){ 
     // this would be easy... but it doesn't work


     //  $rootScope.$on('signal.missionComplete', function (event, missionId) {
     //       console.log("parentScope receive notice that mission " + missionId + " is complete.");
     //  });

     log('GlobalController loaded');
     //  log($squareMgr.getSquaresEarned()); //broken
});

然后,阅读文档,我试过:

globalModule.controller('GlobalController', ['squareMgr', function($squareMgr){  

    // but then how do I get $scope in there?

    log('GlobalController loaded');
    //  log($squareMgr.getSquaresEarned());

}]);

2 个答案:

答案 0 :(得分:1)

在上一个代码块中,您还需要注入$ scope。您可以注入所需的任何数量的服务:

globalModule.controller('GlobalController', ['squareMgr', '$scope', 
    function($squareMgr, scope){  

    // but then how do I get $scope in there?

    log('GlobalController loaded');
    //  log($squareMgr.getSquaresEarned());

}]);

还有一点,我不会在squareMgr前放$$意味着它是一个内置的角度服务。

答案 1 :(得分:0)

尝试

globalModule.controller('GlobalController', ['squareMgr', '$scope', function($scope, squareMgr){ .....

$ sign用于区分Angular服务和您自己的