如何将Ember路由拆分为多个命名空间?

时间:2013-04-29 16:52:21

标签: javascript ember.js

我有两个Ember应用程序,其功能部分重叠,所以我想将常用部分提取到一个单独的模块中。这个提取的模块包含路由,控制器,视图等... - 所有这些都在它们自己的命名空间中定义,比方说Shared

Shared = Ember.Namespace.create();

Shared.FooRoute = Ember.Route.extend({ /*...*/ })
Shared.FooController = Ember.Controller.extend({ /*...*/ })

// ...

我的问题是,除了默认的Shared命名空间之外,我如何告诉Ember查看App命名空间中的路由(控制器,视图......)?

App.Router.map(function() {
  this.route("foo"); // <-- how to tell it I want Shared.FooRoute, 
                     //     not App.FooRoute?
})

另外,我不想在任何路由前缀下“挂载”共享路由。我不希望Shared.FooRoute拥有路径shared/foo,而只需要foo

1 个答案:

答案 0 :(得分:0)

我自己想通了。人们可以通过提供自定义的resolver来影响Ember解析路线(和其他物体)的方式。这就是我所做的:

App = Ember.Application.create({
  resolver: Ember.DefaultResolver.extend({
    resolveOther: function(parsedName) {
      // try default resolution...
      var result = this._super(parsedName);

      if (result) {
        return result;
      } else if (parsedName.root != Shared) {
        // if it fails, look in the Shared namespace
        parsedName.root = Shared;
        return this.resolveOther(parsedName);
      } else {
        return null;
      }
    }
  })
})