EmberJS:如何使用动态段返回数组来处理路由?

时间:2013-05-28 01:44:07

标签: ember.js

修改

我通过升级到EmberJS RC4来解决这个问题。此版本不会自动调用路径上的模型挂钩,这允许以下内容:

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

编辑结束

我正在尝试在EmberJS&中添加带有动态细分的路线。 Ember Data w / RESTful Adapter返回一个数组,但是我失败了。

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')
});

这会返回以下错误:

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

来自JSON的形式{lifts:[{id:1,name:“xyz”,...},{id:2,name:“abc”,...]}

有什么想法吗?

2 个答案:

答案 0 :(得分: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
}

这将保留网址结构(如果您转到/lifts/1,2,3,该网址将被保存),但也会返回一系列项目。

结束编辑

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

执行App.Lift.find(params.county)时(假设params.county为“1”),Ember会生成GET '/lifts/1'。但无论出于何种原因,您的服务器都使用具有数组的密钥返回JSON。

你能检查一下吗

  1. GET请求ember制作的确是单个id吗?如果您使用的是Chrome,请检查网络请求 - App.Lift.find(params.county)要求的资源是什么?
  2. 是否定义了params.county?如果它未定义,您将调用App.Lift.find(undefined),这使得GET为/lifts,这可能导致您的服务器返回对象数组。
  3. 您的服务器在请求单个ID时是否正确响应请求?

答案 1 :(得分:0)

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

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

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