2014-01-18 20 views
4

我有一个的hasMany /属于关联关系为什么在成功创建hasMany之后需要手动pushObject?

App.Appointment = DS.Model.extend({ 
    employee: belongsTo('employee', { async: true}) 
}); 
App.Employee = DS.Model.extend({ 
    appointments: hasMany('appointment', { async: true}) 
}); 

我有一个简单的表格,让我创建约会

var appointment = { 
    employee: employee (another ember-data model) 
} 
this.store.createRecord('appointment', appointment).save().then(function(apt) { 
    self.get('target').transitionTo('day.index'); 
} 

如果我做了我上面的“雇员”阵列从来没有正确显示倒数(即它不反映新的约会,当我做一些后来像employee.get('约会');

我已经能够“解决”这个问题瓦特/类似于下面的东西

this.store.createRecord('appointment', appointment).save().then(function(apt) { 
    employee.get('appointments').pushObject(apt); 
    employee.save(); 
    self.get('target').transitionTo('day.index'); 
} 

我不喜欢这样的原因有二

  1. 我觉得如果我有烬数据接线是否正确,它只是 应该“知道”我已经添加了一个新的约会w^/相关的员工(如 我看到越网络线路的)

  2. 这迫使我的hasMany一个“查找”(这样的话它激发了一个请求 要求员工APTS - 通常搞乱的范围“如何 很多”适合我想展示给定的上下文)。

我的关系在这里设置正确吗?或者这是一个烬数据1.0测试版4/5中的错误?

我目前使用的余烬数据1.0测试版4 ember.js 1.3.1

+0

这是不幸的听,是那种希望[夫妻关系逆]的(http://emberjs.com/api/data/classes/DS.html#method_hasMany)将解决这些类型的问题,从预烬数据1.0。如果您明确指定了反向关系,就像他们在文档中所建议的那样,它会起作用吗? – Adam

+0

这只适用于非异步。 Async在问题中有点有趣,他们不想在请求它们之前获取记录。然后,如果你注入一个项目,那么你如何表示你想要新记录与那一个记录 – Kingpin2k

+1

这更像是一个困境而不是一个错误。我不确定是否适合所有解决方案。 – Kingpin2k

回答

1

对于它的价值,这里是我目前使用做一个递归节省我的“项目”。他们有孩子,他们有与他们相关的权限。还值得注意的是,这些项目是递归的(所以,项目可以有孩子,这些项目可以有孩子......等等)。这将处理一些项目被保存或不包括所有父母重新关联以及不包括的情况。这个对我有用。这可以帮助你(或者它可能只是迷惑你完全,我希望不会,但。)

如果你能得到的东西有用,这是伟大的:)

另外值得一提的是,我不做任何与我的错误捕获。这显然不理想!

saveAll: function() { 
    var saveExistingObjects, self; 
    saveExistingObjects = function(item) { 
    var promise; 
    promise = new Ember.RSVP.Promise(function(resolve, reject) { 
     return item.get('childItems').then(function(childItems) { 
     var childPromises; 
     childPromises = childItems.map(function(childItem) { 
      return saveExistingObjects(childItem); 
     }); 
     return Ember.RSVP.all(childPromises).then(function(arrayOfSavedChildren) { 
      var itemPermissions, itemWasNew; 
      itemWasNew = item.get('isNew'); 
      itemPermissions = item.get('itemPermissions'); 
      return item.save().then(function(savedItem) { 
      if (itemWasNew) { 
       arrayOfSavedChildren.forEach(function(childItem) { 
       childItem.set('parentItem', savedItem); 
       return childItem.save(); 
       }); 
       itemPermissions.forEach(function(itemPermission) { 
       itemPermission.set('item', savedItem); 
       return itemPermission.save(); 
       }); 
      } 
      savedItem.set('childItems', []); 
      Ember.RSVP.Promise.cast(savedItem.get('childItems')).then(function(cb) { 
       return cb.addObjects(arrayOfSavedChildren); 
      }); 
      return resolve(savedItem); 
      })["catch"](function(error) { 
      console.log("Didn't save!"); 
      return reject(error); 
      }); 
     })["catch"](function(error) { 
      console.log("Didn't finish saveExistingObjects and returning childPromises"); 
      console.log(error); 
      return reject(error); 
     }); 
     })["catch"](function(error) { 
     console.log("Didn't get childItems"); 
     console.log(error); 
     return reject(error); 
     }); 
    }); 
    return promise; 
    }; 
    self = this; 
    return saveExistingObjects(self); 
} 
相关问题