我正在使用AngularJS框架(noobie),我正在尝试开发一个必须合并2个资源的服务String
。我的意思是合并2个请求的结果(json):
当 string - '+ language +'/:stringId.json 存在时,它很有用。但是当不存在时,控制台中会显示错误404,如我所料,但String.get(...)的返回为空。
Service.js
angular.module(...)
.value('Language', 'fr')
.factory('String', ['$resource', 'Language',
function($resource, language){
return jQuery.extend(
$resource('string/:stringId.json'),
$resource('string-'+language+'/:stringId.json')
);
}])
Controllers.js
angular.module('exBusiApp.controllers', [])
.controller('LayoutCtrl', ['$scope', 'String',
function($scope, String, version) {
$scope.string = String.get({stringId: "layout"});
}])
我想要的是:在我的控制器中调用一个服务,该服务以当前语言返回所需的字符串(stringId参数)(控制器不需要关心语言,服务就可以解决这个问题)。为此我需要一个服务,它合并2个json文件的结果(对于默认字符串和其他特定语言,如果缺少良好语言json中的某些字符串,则使用默认值)。所以我的想法是合并2个资源。
当存在2个文件时,它运行良好。例如:en {hello:“你好,错误:”错误“} fr {hello:”bonjour“}该视图能够显示bonjour和错误(因为错误未在法语文件中定义)
如果有人有想法,将不胜感激。
答案 0 :(得分:2)
如果没有$resource
:
angular.module(...)
.value('Language', 'fr')
.factory('String', ['$http', '$q', 'Language', function($http, $q, Language){
return {
get: function(stringId){
var deferred = $q.defer(),
intermediate = $q.defer(),
generic = $http.get('string/' + stringId + '.json'),
specific = $http.get('string-' + Language + '/' + stringId + '.json');
specific.then(function(data) { intermediate.resolve(data); }, // Success
function() { intermediate.resolve({}); }); // Error
$q.all([generic, intermediate.promise]).then(function(results) {
deferred.resolve(jQuery.extend(results[0].data, results[1].data));
});
return deferred.promise;
}
}
}]);
这使用普通$http
和两个承诺。为了允许第一个请求失败,它解析了另一个(中间)promise,它总是成功。
然后解决,合并中间承诺和第二个请求的承诺,最终解决结果的新承诺。您可以在控制器中使用它,如下所示:
angular.module('exBusiApp.controllers', [])
.controller('LayoutCtrl', ['$scope', 'String',
function($scope, String, version) {
$scope.string = "";
String.get("layout").then(function(result) {
$scope.string = result;
});
}]);