【问题标题】:Why do I need to manually pushObject after a successful hasMany create?为什么hasMany创建成功后需要手动pushObject?
【发布时间】:2014-01-18 15:50:16
【问题描述】:

我有一个 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('appointments') 之类的操作时,它不会反映新的约会;

我已经能够通过以下方式“解决”这个问题

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

我不喜欢这个有两个原因

  1. 我觉得如果我正确连接了 ember 数据,它应该只是 “知道”我已经添加了与相关员工的新约会(如 我看到它越界了)

  2. 这会强制对我的 hasMany 进行“查找”(因此它会触发一个请求 要求员工适应 - 经常弄乱“如何”的范围 许多“我想在给定的上下文中显示的apts)。

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

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

【问题讨论】:

  • 很遗憾听到这个消息,有点希望inverses on relationships 能够从 ember-data 1.0 之前解决这些类型的问题。如果您像文档中建议的那样明确指定反向关系,它是否有效?
  • 这只适用于非异步。异步有点有趣,因为他们不想在您请求记录之前获取记录。然后如果你注入一个项目,你如何表示你想要新记录而不是那个记录
  • 这更像是一个困境而不是一个错误。我不确定是否适合所有解决方案。
  • 那么短期内我可以手动添加到 didCreate 中的 RecordArray 的折衷方案是什么(不获取 hasMany 关系?)。如果我需要接触私有 API 直到得到核心团队的喜爱——我现在愿意接受
  • 对于任何可能跟随的人 - 这解决了上面的#2(显然仍然是一个黑客)employee.get('data').appointments.pushObject(apt);

标签: ember.js ember-data


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 2022-12-01
    • 2020-09-17
    • 1970-01-01
    • 2013-09-02
    • 2014-09-19
    • 1970-01-01
    • 2016-06-04
    • 2016-05-29
    • 2020-05-06
    相关资源
    最近更新 更多