EmberJS动态路由和配置

时间:2013-04-18 13:57:06

标签: ember.js ember-router

我使用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的名称。这就是我通过从ModuleARoutingExtend()获取'贡献者'及其值Ember.Route.extend({/ * some code *})来使用eval来动态的原因;

所以,我的问题是:是否有更好的方法为我的应用程序动态添加一些路由并获取其配置?如果没有,它仍然是一个好方法吗?

0 个答案:

没有答案