Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 保存嵌套模型_Ember.js_Ember Data - Fatal编程技术网

Ember.js 保存嵌套模型

Ember.js 保存嵌套模型,ember.js,ember-data,Ember.js,Ember Data,我有两个这样的模型: 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') }); App.Bui

我有两个这样的模型:

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')
});
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);
         }
     }
});
App.BuildSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin,{
    attrs: {
        skills: 'records'
    }
});
在我的应用程序中,我有设置每项技能的效忠、职业和价值观的控件(最多55项)

然后在我的应用程序控制器的actions散列中,我有一个将构建模型保存到服务器的操作

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!');
}
但是,当生成模型发送到服务器时,skills属性是一个空数组:

{"build":{"allegiance":"1","profession":"1","skills":[]}}
我肯定我做错了什么,但我不知道是什么,也找不到任何关于它的好文档。另外,我只关心提交的技能id和值

任何帮助都将不胜感激

更新:

根据Daniel的建议,我编辑了save函数,使用pushObjects将技能放入构建模型中,然后保存它。现在情况好多了。现在生成的post数据如下所示:

{"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和值,这是我唯一需要的部分,但这给了我一个错误。比如,不能使用未定义的,必须是类型技能

这似乎是灰烬数据应该本机处理的事情。在请求中发送其他技能属性时,我是否缺少一些东西


谢谢

技能模型是记录阵列吗?这就是Ember数据使用的基础模型。您可以尝试创建记录,然后在事后使用pushObjects

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

  build.get('skills').pushObjects(skills);
此外,save会返回一个承诺,因此为了正确处理成功的save与失败的save,您可以这样处理它

 build.save().then(
    function(){
     console.log('Saved!');
    },
    function(){
     console.log('Failed to save');
    });

如果其他人感兴趣,我通过为
Build
模型使用自定义serliazer覆盖serlizer解决了这个问题,如下所示:

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')
});
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);
         }
     }
});
App.BuildSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin,{
    attrs: {
        skills: 'records'
    }
});
更新:

现在,有一种更简单的方法可以通过如下方式实现:

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')
});
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);
         }
     }
});
App.BuildSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin,{
    attrs: {
        skills: 'records'
    }
});

不,那似乎不起作用。我犯了一个错误。我认为技能是一种承诺。它是从
/skills
加载的。你能重复一下skills吗?forEach(函数(sk){console.log(sk);});是的,我应该能够迭代它。我只是不知道那时候该怎么办。这是我在状态为root.deleted.saved时尝试处理事件
didSetProperty
时遇到的错误。调用时使用{name:allegiance,oldValue:undefined,originalValue:undefined,value:undefined}。skllls是否为null/undefined?console.log(build.get('skills'))不,它不是null/未定义。这是一个承诺数组,现在有一个更好的方法。使用,只需几行代码即可在中添加关联的记录。