AngularJS,合并2个资源的服务

时间:2013-11-25 17:18:59

标签: javascript angularjs angularjs-service

我正在使用AngularJS框架(noobie),我正在尝试开发一个必须合并2个资源的服务String。我的意思是合并2个请求的结果(json):

  • string /:stringId.json
  • 串 - '+语言+'/:stringId.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和错误(因为错误未在法语文件中定义)

如果有人有想法,将不胜感激。

1 个答案:

答案 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;
        });
    }]);