2

既存のプロジェクトでrequireJSを使用しようとしています。現在のロケール、URL ...に関する情報を持つAppモジュールがあり、現在のロケールが特別なものである場合は別のモジュールをロードしたい:

// 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モジュールロードされると確信している場合は、shimを使用してラップするrequire(['locale/fa']か、shimを使用できます。現在、私は古いブロッキング方法を使用して適切なファイルをロードlocale/*.jsし、PHPを使用して適切なファイルを問題なく選択しています。しかし、requireJSプログラマーがどのように同様のコードを書くのか知りたいです。おそらく、このコードよりも優れた方法があります。

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

1 に答える 1

2

これは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
    }
})

app.jsファイル:

require(['app','i18n!nls/formatters'], function(App, Formatters) {
    Formatters.currency(5.00); // works!
});
于 2012-10-07T02:24:28.730 に答える