2

私はこのような2つのモデルを持っています:

App.Build = DS.Model.extend({
    allegiance: DS.attr('string'),
    profession: DS.attr('string'),
        skills: DS.hasMany('skill')
});

App.Skill = DS.Model.extend({
    name:DS.attr('string'),
    value:DS.attr('number')
});

私のアプリでは、忠誠心、職業、各スキルの値を設定するためのコントロールがあります (最大 55 まであります)。

次に、アプリケーション コントローラーのアクション ハッシュに、ビルド モデルをサーバーに保存するアクションがあります。

save:function(){
     var store = this.get('store');
     var skills = this.get('controllers.skills').get('model');
     console.log(skills);
     var build = store.createRecord('build',{
          profession:1,
          allegiance:1,
          skills:skills
      });

      build.set('skills',skills);
      build.save();

      console.log('Saved!');
}

ただし、ビルド モデルがサーバーに送信されると、スキル プロパティは空の配列になります。

{"build":{"allegiance":"1","profession":"1","skills":[]}}

私は何か間違ったことをしていると確信していますが、何を理解できず、それに関する適切なドキュメントを見つけることができません。追加の注意として、私が提出するのはスキル ID と値だけです。

どんな助けでも大歓迎です!

アップデート:

Daniel の提案に従って、save 関数を編集して、pushObjects を使用してスキルを Build モデルに入れ、それを保存しました。今はうまくいっています。生成された投稿データは次のようになります。

{"build":{
    "allegiance":1,
     "profession":1,
          "skills":["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55"]}}

それはスキルIDのリストです。他の属性は投稿で送信されません。スキルを反復処理し、新しいオブジェクトを作成し、必要な唯一の部分である ID と値をプッシュしようとしましたが、エラーが発生します。のようなものは、undefined を使用できません、タイプ スキルでなければなりません。

これは、Ember データがネイティブに処理する必要があるようです。リクエストで他のスキル属性を送信するために不足しているものはありますか?

ありがとう!!

4

2 に答える 2

6

他の誰かが興味を持っている場合は、次のBuildようにモデルのカスタム serliazer で serlizer をオーバーライドして問題を解決しました。

App.BuildSerializer = DS.RESTSerializer.extend({
     serializeHasMany: function(record, json, relationship) {
         if(relationship.key === 'skills') {
            var skills = record.get('skills');
            var block = [];

            skills.forEach(function(skill, index) {
                var current = {};
                current.id = skill.get('id');
                current.value = skill.get('value')
                block[index] = current;
            });

            json['skills'] = block;

         } else {
             return this._super(record,json,relationship);
         }
     }
});

アップデート:

次のようにDS.EmbeddedRecordsMixinを使用して、これを行うためのはるかに簡単な方法があります。

App.BuildSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin,{
    attrs: {
        skills: 'records'
    }
});
于 2013-10-24T04:02:37.930 に答える
0

スキル モデルは RecordArray ですか? これが、Ember データが使用する基本モデルです。レコードを作成してから、後で pushObjects を使用してみてください。

  var build = store.createRecord('build',{
      profession:1,
      allegiance:1
  });

  build.get('skills').pushObjects(skills);

さらに、 save は promise を返すため、保存の成功と失敗を適切に処理するには、次のように処理できます。

 build.save().then(
    function(){
     console.log('Saved!');
    },
    function(){
     console.log('Failed to save');
    });
于 2013-10-18T20:34:47.287 に答える