【问题标题】:Trouble accessing data in relationships in Ember在 Ember 中访问关系中的数据时遇到问题
【发布时间】:2014-06-04 02:33:50
【问题描述】:

我无法在此模型关系中保存数据。我的模型如下:

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')
});

如您所见,我希望流具有多个参数。我有一个使用 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 的解决方案后,当我检查打印语句时,该参数似乎是在我拥有的 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();
  });
},

【问题讨论】:

    标签: ember.js model attributes ember-data


    【解决方案1】:

    params 需要等待异步,然后才能在其上设置属性或模型(这是在 1.0 最终命中之前正在强化的东西,但现在在 1.0 测试版中很挑剔)。如果您使用的是夹具适配器,则会应用夹具 ID。

    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

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

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

    【讨论】:

    • 嗯,它仍然没有按照我期望的方式工作。我正在尝试访问控制器中 removeFlow 函数中的参数,以便在删除流之前删除参数。在摆弄并将参数 MutableArray 转换为常规 Javascript 数组之后,我能够访问各个参数,至少在 createJob 方法中是这样。但是,它似乎在 deleteJob 方法中不起作用。我会更新主帖。
    猜你喜欢
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    相关资源
    最近更新 更多