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
a
takenseat
链接到哪个。将tour\u id添加到响应JSON。你之前添加了适配器的映射吗ore初始化存储和适配器?@albertjan,假设我只想获取“tour\u id”,使用上面的示例,我将执行以下操作:tour.get('takenSeats')。get('tour\u id')或tour.get('takenSeats')。tour\u id。谢谢。