Angular-翻译:从控制器设置自定义加载器选项

Angular-translate: Set custom loader option from controller

今天,我有一个 translateProvider 的配置,如下所示:

App.config(['$translateProvider', function ($translateProvider) {
  $translateProvider.preferredLanguage('en-US');
  $translateProvider.useLoader('TranslationLoader', { versionIdentifier : 127} );
  $translateProvider.useMissingTranslationHandler('MissingTranslationHandler');
}]);

问题是我在配置时不知道 formIdentifier-option 的值。我在解析 ui-route 中的第一个状态后得到这个值。我试图在状态控制器中设置 translationProvides 加载程序,但意识到这是不可能的:)

有什么想法吗?

angular-translate 允许您将任何服务用作加载程序,只要它满足所需的接口即可。但它不会限制您将附加参数传递给加载程序的方式。所以,你可以随心所欲地传递它们。

例如,您可以直接为加载器设置额外的参数。只需在加载器之上为它们实现设置器:

module.factory('Loader', [
'$q',
function($q) {

    var myParam;

    var loader = function(options) {
        var allParams = angular.extend({}, { myParam: myParam }, options);
        var deferred = $q.defer();

        // load stuff

        return deferred.promise;
    };

    loader.setMyParam = function(param) {
        myParam = param;
    };

    return loader;
}])

此外,您可以尝试使用一些辅助服务(同步或异步)设置这些参数:

module.factory('SyncLoader', [
'$q', '$injector',
function($q, $injector) {

    var loader = function(options) {
        var helper = $injector.get(options.helper);

        var myParam = helper.getMyParam();

        var deferred = $q.defer();

        // load stuff

        return deferred.promise;
    };

    return loader;
}]);

module.factory('AsyncLoader', [
'$q', '$injector',
function($q, $injector) {

    var loader = function(options) {
        var helper = $injector.get(options.helper);

        var deferred = $q.defer();

        helper.getMyParam()
            .then(function success(myParam) {
                // load stuff
            }, function error() {
                // fail, probably
            });

        return deferred.promise;
    };

    return loader;
}]);

此外,也许可以以某种方式使用事件。或者,也许还有其他一些可能的方法。这取决于特定的体系结构。