确保已加载requireJS条件模块

时间:2012-10-06 21:18:52

标签: javascript requirejs

我正在尝试在现有项目中使用requireJS。我有一个App模块,其中包含有关当前区域设置的信息,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
    };
});

现在问题是我不知道App模块何时加载了number方法。如果我确定locale/fa模块应该加载某些点,我可以使用require(['locale/fa']或使用shim来包装它。目前我正在使用旧的阻塞方式加载适当的locale/*.js和PHP来选择正确的文件,没有问题。但我想知道requireJS程序员如何编写类似的代码。可能有一些比这段代码更好的方法:

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

1 个答案:

答案 0 :(得分:2)

这听起来像是i18n plugin的情况!我相信你可以定义函数和字符串。我会像这样定义一个包:

//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
    }
})

在你的app.js文件中:

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