1

私は EmberJS v1.0.0-rc.2 と requireJS を使用しています。
私のアプリの構造はそのようなものです。

- app
- - moduleA

私のメインファイル:

#app/main.js

var App = Ember.Application.create({
    VERSION: '1.0',
    //Log router transitions:
    LOG_TRANSITIONS: true
});

App.Router.map(function() {
    AppRouting.call(this);
});

App = AppRoutingExtend(App);

App.initialize();

関数 AppRouting() および AppRoutingExtend() は、仲間のファイルで見つけることができます。

#app/routing.js

function AppRouting() {
    this.resource('root', {path: '/'}, function() {
        this.resource('moduleA', {path: '/'}, function() {
            ModuleARouting.call(this);
        });
    });
}

function AppRoutingExtend(App) {
    var ModuleARouting = ModuleARoutingExtend();

    //Check if ModuleARouting is not empty
    if (!Ember.isEmpty(ModuleARouting)) {
        $.each(ModuleARouting, function(key, value) {
            //Check if key is a string of only letters 
            //  And if value is like Ember.Route.extend({})
            if (typeof key === 'string' && /^[a-zA-Z]+$/.test(key)
                && value.toString() == '(subclass of Ember.Route)') {
                eval("App.Root" + "ModuleA" + key + "Route = value");
            } else {
                //Throw error
            }
        });
    }

    return App;
}

関数 ModuleARouting() および ModuleARoutingExtend() は、次のファイルで見つけることができます。

#app/moduleA/routing.js

function ModuleARouting() {
    this.route("contributors", {path: "/"});
    this.resource('aContributor', {path: "/:githubUserName"}, function() {
        this.route("details", {path: "/"});
        this.route("repos", {path: "/repos"});
    });
}

function ModuleARoutingExtend() {
    var routes = {};

    routes['Contributors'] = Ember.Route.extend({
        /*
            Some Code
        */
    });
    routes['AContributor'] = Ember.Route.extend({
        /*
            Some Code
        */
    });
    routes['AContributorDetails'] = Ember.Route.extend({
        /*
            Some Code
        */
    });
    routes['AContributorRepos'] = Ember.Route.extend({
        /*
            Some Code
        */
    });

    return routes;
}

新しいモジュールを追加するかモジュールを削除することで、ルーティング パスをアプリケーションに動的に追加できるように作成AppRouting()しました。ModuleARouting()このようにして、各モジュールはインターン構造を持ち、AppRouting()それらをマージすることができます。

ModuleARoutingExtend()ただし、具体的にはわかりませんAppRoutingExtend()。最後の例では、 のようにルートを変更しようとしていApp.RootModuleAContributorsRouteます。ちなみに、どのルートが によって作成されたのか直接の情報を持っていModuleARouting.call(this)ないため、変数の名前を知ることはできませんRootModuleAContributorsRoute。これが、'Contributors'ModuleARoutingExtend()とその値 Ember.Route.extend({/* some code *});から取得することで eval を動的に使用する理由です。

だから、私の質問は次のとおりです。アプリケーションにいくつかのルートを動的に追加し、それらの構成を取得するより良い方法はありますか? そうでない場合、それはまだ良い方法ですか?

4

0 に答える 0