Javascript js从父级获取嵌套资源属性
我有这些模型:Javascript js从父级获取嵌套资源属性,javascript,ember.js,ember-data,Javascript,Ember.js,Ember Data,我有这些模型: TravelClient.Tour = DS.Model.extend({ title: DS.attr('string'), description: DS.attr('string'), seats: DS.attr('number'), takenSeats: DS.hasMany('TravelClient.TakenSeat', {embedded:'always'}) TakenSeats: function() { console.lo
TravelClient.Tour = DS.Model.extend({
title: DS.attr('string'),
description: DS.attr('string'),
seats: DS.attr('number'),
takenSeats: DS.hasMany('TravelClient.TakenSeat', {embedded:'always'})
TakenSeats: function() {
console.log(this.get('takenSeats').toArray())
}.property('takenSeats')
});
TravelClient.TakenSeat = DS.Model.extend({
tour: DS.belongsTo('TravelClient.Tour'),
number: DS.attr('number')
});
JSON如下所示:
{
"tours": [
{
"id": "5110e8b5a8fefe71e0000197",
"title": "qui deserunt dolores",
"description": "Id velit nihil.",
"seats": 12,
"taken_seats": [
{
"id": "5110e8b5a8fefe71e0000196",
"number": "5"
},
{
"id": "5110e8b5a8feffffe0000196",
"number": "2"
}]
}
[{
"id": "5110e8b5a8fefe71e0000197",
"taken_seats": [{
"id": "5110e8b5a8fefe71e0000196",
"tour_id": "5110e8b5a8fefe71e0000197"
"number": "5"
}]
}]
但是,是的,当我在Tour模型的方法中执行console.log(this.get('takenSeats').toArray()
时,它返回uncaughttypeerror:无法调用未定义的方法'\u create',所以,takenSeats似乎没有随父模型加载。怎么了
更新
将tour_id添加到JSON,但现在,当我想使用计算属性时:
freeSeats: function() {
var seats = this.get('seats');
var takenSeats = this.get('takenSeats');
if (takenSeats) {
return (seats - takenSeats.length);
}
else {
return seats;
}
}.property('seats', 'takenSeats')
takenSeats尚未定义
更新2:
TravelClient.RESTSerializer = DS.RESTSerializer.extend({
init: function() {
this._super();
this.map('TravelClient.Tour',{
images:{embedded:'always'},
options:{embedded:'always'},
takenSeats:{embedded:'always'}
});
}
});
TravelClient.CUSTOMAdapter = DS.RESTAdapter.extend({
bulkCommit: false,
serializer: TravelClient.RESTSerializer.create(),
url: "http://192.168.1.27:3000",
buildURL: function(record, suffix) {
var s = this._super(record, suffix);
return s + ".json";
}
});
TravelClient.Store = DS.Store.extend({
revision: 11,
adapter: TravelClient.CUSTOMAdapter.create()
});
TravelClient.store = TravelClient.Store.create();
takenseat
computed属性被视为一个类,因为它是大写的。在该嵌入加载旁边,必须进行不同的配置。这样:当takenseat
更改时,tour对象将变为脏
DS.RESTAdapter.map('TravelClient.Tour', {
takenSeats: { embedded: 'always' },
});
或者:这样巡演就不会变得脏了
DS.RESTAdapter.map('TravelClient.Tour', {
takenSeats: { embedded: 'load' },
});
在初始化存储和适配器之前执行此操作。这将使计算属性变得不必要。您只需执行tour.get('takenSeats')
哦,您不必再指定嵌入的类型。id位于take\u seats
数组中,链接回tour
需要调用tour\u id
{
"tours": [{
"id": "5110e8b5a8fefe71e0000197",
"taken_seats": [{
"id": "5110e8b5a8fefe71e0000196",
"tour_id": "5110e8b5a8fefe71e0000197"
"number": "5"
}]
}]
}
我也遇到了类似的问题。余烬模型不能通过嵌套对象进行映射
您的JSON输出当前将所有数据嵌套在tours
根目录下
如果您可以访问API,那么我建议您尝试删除根,否则请考虑将您的作为主对象,然后从那里获取所有嵌套对象
与此相反:
"tours": [{
"id": "5110e8b5a8fefe71e0000197",
"taken_seats": [{
"id": "5110e8b5a8fefe71e0000196",
"tour_id": "5110e8b5a8fefe71e0000197"
"number": "5"
}]
}]
让它看起来像这样:
{
"tours": [
{
"id": "5110e8b5a8fefe71e0000197",
"title": "qui deserunt dolores",
"description": "Id velit nihil.",
"seats": 12,
"taken_seats": [
{
"id": "5110e8b5a8fefe71e0000196",
"number": "5"
},
{
"id": "5110e8b5a8feffffe0000196",
"number": "2"
}]
}
[{
"id": "5110e8b5a8fefe71e0000197",
"taken_seats": [{
"id": "5110e8b5a8fefe71e0000196",
"tour_id": "5110e8b5a8fefe71e0000197"
"number": "5"
}]
}]
可能我的语法不正确,但这种类似的想法对我很有效。谢谢,我应该在服务器端定义tour\u id还是在DS.Model中添加它?在服务器上。如果你想看到tour
atakenseat
链接到哪个。将tour\u id添加到响应JSON。你之前添加了适配器的映射吗ore初始化存储和适配器?@albertjan,假设我只想获取“tour\u id”,使用上面的示例,我将执行以下操作:tour.get('takenSeats')。get('tour\u id')或tour.get('takenSeats')。tour\u id。谢谢。