19

我不断看到在 AngularJS 中创建控制器和服务的不同示例,我很困惑,谁能向我解释这两种方法之间的区别?

app.service('reverseService', function() {
    this.reverse = function(name) {
        return name.split("").reverse().join("");
    };
});

app.factory('reverseService', function() {
    return {
        reverse : function(name) {
            return name.split("").reverse().join("");
        }
    }
});

还有一个控制器示例:

function ExampleCtrl($scope) {
    $scope.data = "some data";
}

app.controller("ExampleCtrl", function($scope) {
    $scope.data = "some data";
}
4

2 回答 2

20

第一个会污染全局命名空间,从长远来看这不是你想要的。

function ExampleCtrl($scope){
    $scope.data = "some data";
}

第二个将控制器范围限定为该模块实例。它使它也可注射。更好的是使用数组表示法(如下所示),因为这将在缩小后继续存在。

app.controller("ExampleCtrl", ['$scope', function($scope){
    $scope.data = "some data";
}]);

(角度)服务和工厂之间的差异似乎很小。服务包装了一个工厂,它使用$injector.instantiate来初始化服务。

于 2013-01-06T17:24:04.667 回答
0

我创建控制器和指令的首选方式如下:

/**
* SomeCoolModule.controller.js
*/

(function(){
'use strict';

    angular.module('app.modals.SomeCoolModule').controller('SomeCoolModuleController', SomeCoolModuleController);

    AddFlowCurveModalController.$inject =
        [
            '$scope',
            '$filter',
            '$log',
        ];

    function SomeCoolModuleController($scope, $filter, $log) {
        /* controller body goes here */
    }
})();

PS:由于 IIFE,上面没有发生全局命名空间污染。

于 2015-01-12T13:33:16.983 回答