Обеспечить загрузку условного модуля requireJS


Я пытаюсь использовать requireJS в существующем проекте. У меня есть модуль приложения, который содержит информацию о текущей локали, url ... и хотите загрузить другой модуль, если текущая локаль является чем-то особенным:

// App.js
define([], function() {
    return {
        setEnv: function(obj) { //obj: {locale:'en'}
            this.env = obj;
            that = this;
            if( this.env.locale == 'fa' )
                require(['locale/fa'], function(fa) {
                    that.number = fa.number
                };
            else
                this.number = function( n ) { return n+'' }
        }
    }
});

Файлы локали выглядят следующим образом:

// locale/fa.js
define([], function() {
    var enToFaDigit(n) { // a function converts a number to persian representation };
    // more stuff
    return {
        number: enToFaDigit
    };
});

Теперь проблема в том, что я не знаю, когда модуль приложения загрузил метод number. Если бы я был уверен, что locale/fa модуль должен загрузиться в какой-то момент, я мог бы обернуть его с помощью require(['locale/fa'] или использовать прокладку. В настоящее время я использую старый способ блокировки, чтобы загрузить соответствующий locale/*.js и PHP, чтобы выбрать правильный файл, без проблем. Но я хочу знать, как программисты requireJS пишут подобный код. Вероятно, есть какой-то способ лучше, чем этот код:

require(['app'], function(App) {
    if(App.env.locale == 'fa') {
        require(['locale/fa'], function(fa) {
            // 8-S
        }
    }
});
1 2

1 ответ:

Это звучит как случай для плагина i18n ! Я считаю, что вы можете определять функции, а также строки. Я бы определил связку следующим образом:

//nls/formatters.js
define({
    root: {
        currency: function(num) {
            // implementation for default currency format (en-US often)
        }
    },
    "fa": true
})

И вот ваш персидский переопределитель:

//nls/fa/formatters.js
define({
    currency: function(num) {
        // implementation for farsi currency format
    }
})

В вашем приложении.файл js:

require(['app','i18n!nls/formatters'], function(App, Formatters) {
    Formatters.currency(5.00); // works!
});