2

私はこれらのモデルを持っています:

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"
        }]
}

しかし、ええ、私がconsole.log(this.get('takenSeats').toArray()ツアーモデルのメソッドで行うと、それは返さUncaught TypeError: Cannot call method '_create' of undefinedれるので、takenSeatsは親モデルでロードされなかったようです。どうしたの?

アップデート

JSONにtour_idを追加しましたが、計算されたプロパティを使用する場合は次のようになります。

  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();
4

2 に答える 2

1

計算されたプロパティは、TakenSeats大文字になっているため、クラスとして認識されます。その次に、埋め込まれたロードを別の方法で構成する必要があります。このように:このように、ツアーオブジェクトは変更さdirtyれたときになりtakenseatます。

DS.RESTAdapter.map('TravelClient.Tour', {
    takenSeats: { embedded: 'always' },
});

または:この方法では、ツアーはになりませんdirty

DS.RESTAdapter.map('TravelClient.Tour', {
    takenSeats: { embedded: 'load' },
});

ストアとアダプタを初期化する前にこれを行ってください。これにより、計算されたプロパティが不要になります。あなたはただすることができますtour.get('takenSeats');

ああ、タイプが埋め込まれていることを指定する必要はありません。taken_seatsにリンクする配列内のIDtourを呼び出す必要がありますtour_id

{
  "tours": [{
    "id": "5110e8b5a8fefe71e0000197",
    "taken_seats": [{
      "id": "5110e8b5a8fefe71e0000196",
      "tour_id": "5110e8b5a8fefe71e0000197"
      "number": "5"
    }]
  }]
}
于 2013-02-12T13:41:18.283 に答える
0

私はこれと同様の問題を抱えていました。ember-modelは、ネストされたオブジェクトを介してマップしません。

現在、JSON出力には、toursルートの下にネストされたすべてのデータが含まれています。

APIにアクセスできる場合は、ルートを削除することをお勧めします。そうでない場合は、をメインオブジェクトとして使用し、そこからすべてのネストされたオブジェクトを取得することを検討してください。

これの代わりに:

"tours": [{
    "id": "5110e8b5a8fefe71e0000197",
    "taken_seats": [{
      "id": "5110e8b5a8fefe71e0000196",
      "tour_id": "5110e8b5a8fefe71e0000197"
      "number": "5"
    }]
  }]

次のようにします。

  [{
    "id": "5110e8b5a8fefe71e0000197",
    "taken_seats": [{
      "id": "5110e8b5a8fefe71e0000196",
      "tour_id": "5110e8b5a8fefe71e0000197"
      "number": "5"
    }]
  }]

私の構文が間違っている可能性がありますが、この同様のアイデアは私にとってはうまくいきました。

于 2013-07-13T06:05:00.637 に答える