无法访问Ember关系中的数据

时间:2014-06-04 02:33:50

标签: ember.js model attributes ember-data

我在此模型关系中保存数据时遇到问题。我的模型如下:

App.Flow = DS.Model.extend({
  title: DS.attr('string'),
  content: DS.attr('string'),
  isCustom: DS.attr('boolean'),
  params: DS.hasMany('parameter', {async: true})
});

App.Parameter = DS.Model.extend({
  flow: DS.belongsTo('flow'),
  param: DS.attr('string'),
  param_tooltip: DS.attr('string'),
  param_value: DS.attr('string')
});

如您所见,我希望Flows有多个参数。我使用Flow和Parameter灯具进行了初步设置,它在模板中的行为与预期相同。但是,当我尝试在控制器中创建新的时,我无法正确设置流量和参数值。

var p = this.store.createRecord('parameter', {
  param: "foo",
  param_tooltip: "world",
  param_value: "hello"
});

var f = this.store.createRecord('flow', {
  title: 'job',
  content: title,
  isCustom: true,
  params: [p] // doesn't seem to work
});

f.set('params', [p]); // doesn't seem to work
p.set('flow', f); // also doesn't seem to work

// Save the new model
p.save();
f.save();

我盯着这个和StackOverflow一段时间后尝试了很多解决方案(不仅仅是列出的解决方案)。我不确定下一步该尝试什么。我在Ember检查器中注意到的一件事是这些创建的元素的ID不是整数(它们就像字符串'fixture_0'),但我不确定为什么会这样,无论是相关的,还是如何解决它。

谢谢!

修改

在处理promises ala kingpin的解决方案之后,参数似乎是在我用print语句检查时在createFlow函数中设置的;但是,我仍然无法访问模板和removeFlow函数中的参数。

createJob: function() {
  // ...
  f.get('params').then(function(params) {
    params.pushObject(p);
  });

  f.get('params').then(function(params) {
    console.log(params.toArray()[0].get('param')); // prints 'foo'
  });
  // ...
},

removeJob: function(flow) {
  console.log(flow.get('title')); // prints 'job'
  flow.get('params').then(function(params) {
    var arr = params.toArray();
    console.log(arr); // prints '[]'
    for (var i=0; i < arr.length; i++) {
      console.log('hi'); // never gets printed
      arr[i].deleteRecord();
      arr[i].save();
    }
    flow.deleteRecord();
    flow.save();
  });
},

1 个答案:

答案 0 :(得分:1)

在你可以设置一个属性或模型之前需要等待

params async(这是在1.0最终命中之前被强化的东西,但它现在在1.0中看起来很挑剔测试版)。如果您正在使用夹具适配器,则应用fixture_ids。

var store = this.store;
var p = store.createRecord('parameter', {
   param: "foo",
   param_tooltip: "world",
   param_value: "hello"
  });

 var f = this.store.createRecord('flow', {
   title: 'job',
   content: 'title',
   isCustom: true,
 });

f.get('params').then(function(params){
  params.pushObject(p);

});

 p.set('flow', f);

http://emberjs.jsbin.com/OxIDiVU/588/edit

另外,使用fixture适配器进行保存似乎会删除hasMany关系,因为它们是manyToOne连接(也就是两个记录彼此之间存在关系,其中一个是hasMany)。摆脱其中一个关系可以解决问题(或使用其中一个真正的适配器)

http://emberjs.jsbin.com/OxIDiVU/590/edit