我有一个像这样的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']);
});
答案 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>