解决服务中资源承诺的最佳方法

时间:2016-02-21 20:01:18

标签: angularjs

所以我有一个由应用程序语言决定的资源文件:

.constant('defaultLanguage', 'en_EU')

.service('LocalizationService', ['$resource', 'defaultLanguage', function ($resource, language) {

    // Create our service
    var service = {
        get: function () {

            // Use default if no language is supplied
            language = language || 'en_EU';

            // Get the path of the json
            var path = '/assets/resources/' + language + '/resource.json';

            // Return our promise
            var resource = $resource(path).get();

            // Get our promise
            return resource.$promise;
        }
    };

    // Return our service
    return service;
}])

我要做的是在可能访问它的任何其他服务之前将资源文件加载到我的应用程序中。 我试着这样做:

.run(['LocalizationService', function ($localization) {

    // Get our resource file from the server
    $localization.get().then(function (response) {

        // Assign our response to the service
        $localization.resource = response;

        console.log($localization);
    });
}])

希望我可以使用这样的服务:

.service('SimpleDesignerValidationService', ['$q', 'LocalizationService', function ($q, localization) {     

    // Create our service
    var service = {

        // Validates the design
        design: function (kit) {

            // Create a deferred promise
            var deferred = $q.defer(),
                garments = kit.garments,
                valid = true;

            // For each garment
            for (var i = 0; i < garments.length; i++) {

                // Get our current garment
                var garment = garments[0];

                // if our design is empty
                if (!garment.design) {

                    // We are not valid
                    valid = false;

                    // Break
                    break;
                }
            }

            // If we are not valid
            if (!valid) {

                // Display a warning
                deferred.reject(localization.resource.designInvalid.message);

            // If we are valid
            } else {

                // Resolve our promise
                deferred.resolve();
            }

            // Return our promise
            return deferred.promise;
        }
    }

    // Return our service
    return service;
}])

但在我接受服务之前,承诺从未得到解决。 无论如何我可以确保服务在注入其他服务或控制器之前已经解决了它的承诺吗?

2 个答案:

答案 0 :(得分:0)

  

无论如何,我可以确保服务在将其注入其他服务或控制器之前已解决承诺

在进入另一个控制器之前,您可以使用ui.router来resolve承诺。在定义状态时,在resolve属性中添加 $ localization.get()

答案 1 :(得分:0)

在类似情况下,我最终在加载翻译时广播消息。所有使用翻译的控制器都会收听广播事件并做一些必要的事情来刷新视图。

如果用户可以更改语言,这尤其有用。在这种情况下,您只需加载另一个语言文件并再次播放。