在我的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
}
答案 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
现在您可以判断您的模型是旧的还是已修改的,或者它是新的但是设置了一些属性。 (你必须为关系做更多的工作。)