嵌套资源的麻烦

时间:2015-02-24 09:45:40

标签: javascript ember.js ember-cli

我是Ember的新手,我觉得我比这个练习应用程序更容易咀嚼,但我打算学习。我可能完全在概念上关闭,如果是这样,请随意为我的用例提供更好的结构。

我的(缩写)路由看起来或多或少像这样:

Router.map(function() {
  this.resource('shops', { path: '/' }, function() {
    this.resource('shop', { path: ':shop_id' }, function() {
      this.resource('items', { path: 'admin'}, function() {
      });
    });
  });
});

意图是用户将选择一个商店,然后获得所有可能商品的列表,其中包含复选框,他可以决定该商店中哪些商品可用,哪些商品不可用。到目前为止,我只是想显示所有项目的列表,但它不起作用。然而,商店列表 - 没有任何问题。

  • 网址:/

    作品。 model是所有商店。

  • 网址:/1

    作品。 model是ID为1的商店。

  • 网址:/1/admin

    处理路径时出错:items.index断言失败:ArrayProxy需要一个Array或Ember.ArrayProxy,但是你传递了对象

shopsitems控制器都是相同的:

// app/controllers/shops.js
// app/controllers/items.js
export default Ember.ArrayController.extend({});

路线几乎相同:

// app/routes/shops/index.js
export default Ember.Route.extend({
  model: function() {
    return this.store.find('shop');
  }
});

// app/routes/items/index.js
export default Ember.Route.extend({
  model: function() {
    return this.store.find('item');
  }
});

shop控制器不存在,shop.index路由很简单:

// app/routes/shop/index.js
export default Ember.Route.extend({});

是什么给出了?

编辑: JSBin

2 个答案:

答案 0 :(得分:2)

您的JSBin问题变得相当简单。在原始帖子的简化路由器中,您有this.resource('items', { path: 'admin'}, function() {}); 由于您将函数传递给this.resource,这意味着它具有隐式嵌套this.route('index')

但是,在您的JSBin中,您有this.resource('items, { path: 'admin' }); 由于在这种情况下您没有传递函数,因此没有隐式index路径。

解决方案是添加功能位,或将App.ItemsIndexRoute重命名为App.ItemsRoute,将data-template-name="items/index"重命名为data-template-name="items"

JSBin与后者:http://emberjs.jsbin.com/dahuge/2/edit?html,js

P.S。我还准备了一个仅使用this.route的JSBin,目前对未来更友好:http://jsbin.com/mifamu/9/edit?html,js,output

答案 1 :(得分:0)

通过一个非常有用的“锁定”在IRC上回答。仍存在一些问题,但this JSBin已回答了一个重要问题。我最大的困惑来自误解URL的处理方式,以及link-to助手的作用。我最需要的是ItemsController

的变化
App.ItemsController = Ember.ArrayController.extend({
  needs: ['shop'],
  shop: Ember.computed.alias('controllers.shop.model')
});

会使shop可访问,并且模板中的错误会显示items而不是model