嵌套资源出现问题

Trouble with nested resources

本文关键字:问题 资源 嵌套      更新时间:2024-05-09

我是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

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,输出

在IRC上由一个非常有用的"锁"回答。一些问题仍然存在,但这个JSBin已经回答了一个大问题。我最大的困惑是误解了URL是如何处理的,以及link-to助手的角色是什么。我最需要的是ItemsController:的变化

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

这将使shop可访问,并且模板中说items而不是model的错误。