【发布时间】:2016-02-14 11:20:22
【问题描述】:
我有 2 个控制器和一个服务:
angular.module('objDescApp', ['ui.router', 'ui.bootstrap']);
angular.module('objDescApp').config(['$stateProvider', '$urlRouterProvider', '$httpProvider', function ($stateProvider, $urlRouterProvider, $httpProvider) {
'use strict';
$urlRouterProvider.otherwise('/');
$stateProvider
.state('object', {
url: '/{name}',
views: {
"body": {
controller: 'ObjectDetailCtrl',
template: '...'
}
});
angular.module('objDescApp').controller('ObjectListCtrl', function ($scope, $state, ConfigService) {
ConfigService.getConfig(function(){//get config from server
$scope.object = ConfigService.fillConfigForObjList(); //use config
}
}
angular.module('objDescApp').controller('ObjectDetailCtrl', ['$scope', '$stateParams', 'ConfigService', function ($scope, $stateParams, ConfigService) {
$scope.current_object = ConfigService.fillConfigForObjDetail(); //use config
}
angular.module('objDescApp').factory('ConfigService', function ($http, $rootScope) {
var jsonConf;
var confTemplate = {"sometemplate" : {}};
function fillConfigForObjList (){
... //use jsonConf variable , and always wait for init because of called only inside callback function of getConfig();
};
function fillConfigForObjDetail(){
... //use jsonConf variable , but doesnt wait for jsonConf initialization, so error var 'is undefined' here.So I need to add some waiting for 'jsonConf' initialization logic here
};
return {
jsonConf: jsonConf,
fillConfigForObjDetail: fillConfigForObjDetail,
fillConfigForObjList: fillConfigForObjList,
getConfig: function(callback){
$http({
method: 'GET',
url: endPointUrl,
transformResponse: undefined
}).then(
function successCallback(response) {
jsonConf = JSON.parse(response.data);
$rootScope.getConfigError = false;
callback();
},
function errorCallback(response) {
if(response.status == "404"){
jsonConf = confTemplate;
}else{
console.log("Get config error");
jsonConf = confTemplate;
$rootScope.getConfigError = true;
}
callback();
}
);
}
}
所以,当我用主路径 '/' 加载页面时,一切正常,因为 'ObjectListCtrl' 控制器触发了 getConfig() 函数在响应后设置 'jsonConf' 变量,因此我可以在任何状态之间导航并且一切正常,因为已经设置了 'jsonConf';
但如果我重新加载页面的起始路径状态类似于 '/{name}' ,那么 'ObjectListCtrl' 控制器会触发 'getConfig()' 对服务器的请求,但以异步方式触发了 'ObjectDetailCtrl' 控制器及其 $scope.current_object = ConfigService.fillConfigForObjDetail() 表达式,该表达式抛出 @987654322 @ 那么有人可以告诉我如何在“fillConfigForObjDetail()”函数中等待,直到 getConfig() 函数初始化“jsonConf”变量。
【问题讨论】:
标签: javascript angularjs