【发布时间】:2015-05-08 08:18:16
【问题描述】:
我有一个简单的 AngularJS 应用程序。我现在正在尝试在其中实现 L10n* 机制。为此,我有一个服务,它加载一个字符串文件并返回一个键值数组。这些值稍后会放入视图和控制器中。
为了使事情简单明了,我将返回数组分配给 $rootScope 以便每个控制器/视图都可以访问相同的列表。 我是从 angular.module(...).run() 函数
这就是问题的开始——一些控制器可以访问 $rootScope 对象,而其他一些则不能(并返回未定义)。我怀疑这是因为在加载前几个控制器之前没有及时解决承诺。
问题是 - 如何让控制器等待资源加载?
辅助问题 - 为什么 GenericListController 可以使用 $scope.localisation 而 ListController 不能?
服务声明
app.factory("StringsTranslationService", function($http) {
var getData = function(locale) {
return $http({method:"GET", url:'public/resources/strings_'+locale+'.txt'}).then(function(result){
return result.data[0];
});
};
return { getData: getData };
});
将数据从服务加载到 app.js
中的 $rootScopeapp.run(function($rootScope,StringsTranslationService) {
var myDataPromise = StringsTranslationService.getData('en');
myDataPromise.then(function(result) {
$rootScope.localisation=result;
});
});
最后尝试在controller.js中使用:
var app=angular.module('myApp');
app.controller('ListController', function ($scope, $controller){
console.log($scope.localisation["_NAME_"]);
angular.extend(this, $controller('GenericListController', {$scope: $scope}));
});
最有趣的事实是,GenericListController 也使用了相同的 $scope.localisation 数组并且它没有问题!
加载顺序为:
- app.js
- service.js
- genericController.js
- controller.js
【问题讨论】:
-
您是否考虑过将值数组存储在工厂对象中并将依赖项注入控制器而不是将数据分配给路由范围?
-
是的,托比,我有,但这对我来说不是一个非常有效的解决方案 - 请参阅下面我对 nitin 回答的评论。简而言之 - 1)我不能 b/c 我的视图有时没有控制器,但我在那里使用模型变量。 2)我有一堆控制器,我不想为每个控制器添加额外的代码只是为了支持异步轮询。我需要从 $scope.localisation 以相同的方式加载一次数组并始终可用