0

编辑:

我通过升级到 EmberJS RC4 解决了这个问题。此版本不会自动调用路由上的模型钩子,它允许以下操作:

App.LiftsRoute = Ember.Route.extend({               
  setupController: function(controller, model) {          
    controller.set('content', App.Lift.find({
      county: model.county || model.id
    }));
  }
});

编辑结束

我正在尝试在 EmberJS 和带有 RESTful 适配器的 Ember 数据中添加一个带有动态段的路由,它返回一个数组,但我失败了。

App.Router.map(function() {  
   this.route('lifts', { path: '/lifts/:county' });
});

App.LiftsRoute = Ember.Route.extend({           
  model: function(params) {                   
    return App.Lift.find(params.county);
  }
});

App.Lift = DS.Model.extend({
  name: DS.attr('string'),
  date: DS.attr('number'),
  description: DS.attr('string'),
  destination: DS.attr('string')
});

这将返回以下错误:

未捕获的错误:断言失败:您的服务器返回了一个带有密钥提升的哈希,但您没有它的映射。

从 {lifts: [{id: 1, name: "xyz", ...}, {id: 2, name: "abc", ...]} 形式的 JSON

有任何想法吗?

4

2 回答 2

1

编辑:使用单个动态段设置路由以返回对象数组

您仍然可以保持相同的路由结构:

this.route('lifts', { path: '/lifts/:county_ids' });

然后覆盖该model钩子以解析params.county_ids为查询字符串:

model: function(params) {
  ids  = parseQueryIds(params.county_ids) // you have to parse this in a format that your server will accept
  App.Lift.find({query: ids}) // returns an record array
}

这将保留 url 结构(如果您转到/lifts/1,2,3,将保存该 url),但也会返回一个项目数组。

结束编辑

发生这种情况是因为App.Lift.find,当传递一个字符串时,将尝试通过 id 查询单个对象,但您来自服务器的响应返回多个对象(id 1、id 2 等)。

当你这样做时App.Lift.find(params.county)(假设params.county是“1”),Ember 会生成一个GET '/lifts/1'. 但无论出于何种原因,您的服务器都返回带有数组的键的 JSON。

你能检查一下吗

  1. ember 发出的 GET 请求确实是针对单个 id 的?如果您使用的是 chrome,请检查网络请求——请求的资源是App.Lift.find(params.county)什么?
  2. params.county是定义的?如果它未定义,您将调用App.Lift.find(undefined)GET,这会使 GET 变为/lifts,这可能会导致您的服务器返回对象数组。
  3. 当请求单个 id 时,您的服务器是否正确响应请求?
于 2013-05-28T04:12:14.853 回答
0

出现错误消息是因为您的 JSON 对象的根 id 是复数,并且应该是单数。您的服务器应返回:

{lift: [
        {id: 1, name: "xyz", ...},
        {id: 2, name: "abc", ...}
       ]
}

您很可能随后会遇到 Sherwin 描述的问题,因为 RESTAdapter 的 find() 假定要返回一个单例。

于 2013-05-28T09:10:52.777 回答