如何将新记录的isDirty标志设置为false

时间:2014-10-11 01:21:52

标签: ember.js ember-data

在我的willTransition挂钩中,我使用isDirty来确定模式是否应向用户显示警告,如果他们离开,他们将丢失未保存的更改。问题是,在调整任何字段之前,Ember中的新记录被认为是脏的。我需要一种方法来覆盖这种行为。我没有成功尝试以下内容:

首先,我尝试创建自己的标志,在模型更改时观察并将isNasty标志设置为true。我认为这可能有效,因为我省略了.on('init')但不幸的是,这是为了立即设置新记录。

// app/controllers/foo.js
...
isNasty: false,

modelIsEdited: function () {
  this.set('isNasty', true);
}.observes('model')

接下来我认为isDirty旗帜和isNew的组合可以解决这个问题,这在技术上有所作为。但是如果你然后在新记录中输入字段就会出现问题,它永远不会提示模态:

// app/routes/foo.js
...
willTransition: function() {
  if (this.controller.get('isDirty') && !this.controller.get('isNew') {
     ...
  }
}

同样的问题出现在dirtyType属性中(检查它是created)。

最后,我尝试在创建模型后手动将isDirty标志设置为false,但由于它是一个只读属性,因此无法正常工作。

// app/routes/foo.js
...
setupController: function(controller, model) {
  this._super(controller, model.demo);
  controller.set('isDirty', false);
  // This throws an error as isDirty is a read-only property
}

1 个答案:

答案 0 :(得分:1)

根据我的理解,你想要这个:

if ((model.isDirty && !model.isNew) || (model.isNew && model.isFilledIn)) {}

如果是这种情况,我们已经有3个州中的2个,所以我们只需要想出一种方法来创建isFilledIn状态(或任何你想要的状态)。我很久没有使用过Ember-Data了,但我认为这样可行:

isFilledIn: function() {
    // `this._attributes` holds new values for attributes on the model.
    // Because the model is new, all attributes are new, so if any
    // attributes have been set, they'll be in here.
    return Ember.keys(this._attributes) > 0;
}.property().volatile() // don't try to observe this property

现在您可以判断您的模型是旧的还是已修改的,或者它是新的但是设置了一些属性。 (你必须为关系做更多的工作。)