为什么我不能在ember.js中共享索引和基本路由模型方法?

时间:2013-11-06 18:31:36

标签: ember.js

如果我有这样的嵌套路线

App.Router.map(function() {
  this.resource("foo", {path: "/foos"}, function( {
    this.resource("bar", {path: "/:foo_id/bars"}, function() {
      this.resource("bazz", {path: "/:bar_id"});
    });
  });
});

当我启动应用程序时,我需要一个FooIndexRoute来加载所有foo对象。然而,当我在最底层路线刷新时,我的FooIndexRoute没有被加载,所以我被迫在我的FooRoute中复制模型钩子

我在url结构中做错了什么,迫使我重复这项工作?

2 个答案:

答案 0 :(得分:1)

索引路由是一个捕获所有路由,只有在您访问该资源并且尚未定义默认路由时才会触发它。您应该在路由名称本身上定义模型挂钩并放弃索引路由。

AKA

App.FooRoute = Em.Route.extend({
   model: function....
})

如果您希望索引路由仍然存在,则可以在模型钩子中使用return this.modelFor('foo');索引路由。所以你可以避免两次获取模型等。

此外,在更深的路线中,如果他们的模型只是父路线的子模型,只需使用modelFor获取父模型并过滤掉相应的项目。

如果您需要一个jsbin示例,请告诉我。

答案 1 :(得分:1)

我发现当基本路由(foo)用于加载模型列表并且索引(foo.index)用于显示列表时,它最有效。这是一个优势,因为{{outlet}}路线中的foo最初将使用foo.index视图填充,但是一旦您选择了要追溯到foo'的路线s插座将切换到bar路线的信息。这通过嵌套保留foo的控制器和模型数据。

application
├── foo
│   ├── bar
│   │   ├── bazz
│   │   └── index
│   └── index
└── index

您可以看到,如果您在foo.index路线中加载数据,当您转换到bar路线时,嵌套路径现在不包括foo.index,这意味着它不是容易到达。

在子路线中,您可以使用this.modelFor('foo')检索foo路线的模型,并直接将其用作模型或将其添加到路线的控制器中:

App.FooRoute = Ember.Route.extend({
  model: function() {
    return ['red', 'yellow', 'blue'];
  }
});

// use foo's model as the index's model
App.FooIndexRoute = Ember.Route.extend({
  model: function() {
    return this.modelFor('foo');
  }
});

// this route has its own model, but also include foo's model
App.BarRoute = Ember.Route.extend({
  model: function() {
    return ['bar1', 'bar2', 'bar3'];
  },
  setupController: function(controller, model) {
    this._super(controller, model);
    controller.set('fooModel', this.modelFor('foo'));
  }
});

这是一个显示嵌套的JSBin:http://emberjs.jsbin.com/oxAluJI/1/edit