为什么我需要在成功创建hasMany后手动pushObject?

时间:2014-01-18 15:50:16

标签: ember.js ember-data

我有一个hasMany / belongsTo关系

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('appointmentments');

我已经能够“解决”这个问题,如下所示

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

我不喜欢这个有两个原因

  1. 我觉得如果我有正确连接的ember-data应该只是 “知道”我已经为相关员工添加了一个新的约会(如 我看到穿过电线了)

  2. 这会强制我的hasMany上的“查找”(因此它会触发请求 要求那些员工认识 - 弄乱“怎么样 许多“我想为特定背景展示的apts”。

  3. 我的关系在这里设置正确吗?或者这是ember-data 1.0 beta 4/5中的错误?

    我目前正在使用带有ember.js 1.3.1的ember-data 1.0 beta 4

1 个答案:

答案 0 :(得分: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);
}