Angular服务真的是单身人士吗?

时间:2016-01-12 14:25:31

标签: angularjs

我有一个像这样的Angular服务:

angular.module('MyModule')
    .factory('SharedData', function( ){
        return {
            session_id: undefined, 
            getSessionId: function () {
                return this.session_id;
            },
            setSessionId: function (new_id) {
                this.session_id = new_id;
            },
        };
    }).
    controller( 'MyController', ['SharedData', function( SharedData ){
            console.log( "Retrieved session id = " + SharedData.getSessionId()); 
               // getting undefined here!
    }]);

我之前在另一个模块中调用过该服务:

angular.module( 'bootstrapper' )
    factory("AnotherService", function(){
          var injector = angular.injector(['MyModule', 'ng']),
              shared_data = injector.get('SharedData');
              shared_data.setSessionId( getUrlParameter('SESSIONID'));
          ...

 });

控制台输出结果未定义。

我认为SharedData在' MyController'以及SharedData in' AnotherService'不是同一个对象。然而,人们都说Angular服务是单身人士。他们是真正的单身人士吗?

关于我的模块的更多细节: 我使用了模块' bootstrapper'手动引导另一个模块' MyModule':

angular.module( 'bootstrapper' )
    .run(function () {
        angular.bootstrap(document, ['MyModule']);
    });

3 个答案:

答案 0 :(得分:2)

angular.factory不是构造函数,在我看来,使用angular.service代替会解决您的问题,

答案 1 :(得分:1)

您可以在引导时为应用程序提供常量作为模块依赖项。

angular.module( 'bootstrapper' )
    .config(function () {
        var sessionIdProvider = function ($provide) {
             $provide.constant("SESSIONID", getUrlParameter('SESSIONID'));
        };
        angular.bootstrap(document, ['MyModule', sessionIDProvider]);
    });

有关详细信息,请参阅AngularJS $provide Service API Reference -- constant

<强>更新

您还可以跳过bootstrap应用并在MyModule应用中使用配置块。

angular.module( 'MyModule' )
    .config(function ($provide) {
        $provide.constant("SESSIONID", getUrlParameter('SESSIONID'));
});

有关详细信息,请参阅AngularJS angular.module API Reference

答案 2 :(得分:0)

在思考了一下后,我觉得你选择了不是很好的方法。最好定义bootstrapper应用程序并使其初始化sharedData服务,然后与其他相关模块共享。请注意,不是像您的情况那样的应用程序,而是依赖模块。这会更简单,更清洁。

这是一个允许很好的“模块化”的示例设置:

/**
 * Bootstrapper application.
 */
angular.module('bootstrapper', ['dashboard'])
    .factory('sharedData', function() {
        return {
            sessionId: undefined,
            setSessionId: function(value) {
                this.sessionId = value;
            },
            getSessionId: function() {
                return this.sessionId;
            }
        }
    })
    .controller('BootController', function(sharedData) {
        this.name = 'Bootstrapper app';
        sharedData.setSessionId('34sd-3sdf345g-23a2421b');
    });
    
/**
 * Apllication kicked off by main bootstrapper.
 */
 angular.module('dashboard', [])
    .directive('dashboardModule', function() {
        return {
            controller: 'DashboardController as dashboard',
            template:
              "<div>" +   
              "    {{ dashboard.name }} sessionId: {{ dashboard.sharedData.sessionId }}" +
              "</div>"
        };
    })
    .controller('DashboardController', function(sharedData) {
        this.name = 'Dashboard';
        this.sharedData = sharedData;
    });
<script src="https://code.angularjs.org/1.4.8/angular.js"></script>

<body ng-app="bootstrapper" ng-controller="BootController as boot">
    
    <h3>{{ boot.name }}</h3>
    
    <dashboard-module name="dashboard"></dashboard-module>
  
    <!-- <some-other-module></some-other-module> -->
    
</body>