目标:如果当前路线的模型已更改(即用户已更新某些字段但未保存,即isDirty === true
,则阻止转换到其他路线。
设置:我使用EmberJS.com's Routing guide中的这些确切代码。
export default Ember.Route.extend({
actions: {
willTransition(transition) {
if (this.controller.get('userHasEnteredData') &&
!confirm("Are you sure you want to abandon progress?")) {
transition.abort();
} else {
// Bubble the `willTransition` action so that
// parent routes can decide whether or not to abort.
return true;
}
}
}
});
在我的控制器中,userHasEnteredData
只是一个计算属性,可以监视模型的isDirty
属性。
问题:当我选择从confirm
框中取消时(即"取消转换以便我可以完成编辑"),然后再次弹出确认框。再次取消使它永远消失,但我不知道它为什么会被击中两次。如果我改为说" ok"在第一次确认时,它会继续并转换,而不会再次弹出确认。它只有在第一次取消时才会立即再次弹出。
我试图在ember-twiddle.com上复制,但它在那里工作正常,只调用willTransition
一次。如果它确实在我的代码中被调用了两次,我就无法弄清楚为什么,因为我已经检查过并仔细检查了,而且我没有看到任何内容。在transition.abort()
运行后会导致挂钩被再次调用的不同。
任何线索?
编辑我简化了willTransition
,就这样,它仍然运行了两次。看来transition.abort()
会调用willTransition()
,但这没有任何意义!
actions: {
willTransition: function(transition) {
console.log('trying to transition');
transition.abort();
}
}
}
//logs 'trying to transition' to the console twice!
答案 0 :(得分:1)
对于可能遇到类似问题的任何人:
我遇到一个问题,willTransition
在调用transition.abort()
时被触发两次(试图处理未保存的更改)。
就我而言,问题出在以下两种情况下(无论我是否处理未保存的更改),我都从true
返回了willTransition
。我错误地认为transition.abort()
就足够了。
一旦我将return true;
hasChanges
语句的if
移到else条件,问题就解决了。
willTransition(transition) {
if (this.controller.get(model.hasDirtyAttributes)) {
// Handle unsaved changes...
// ...then `transition.retry()`
} else {
return true; // <-- this worked
}
// return true; <-- this fired `willTransition` twice
}
答案 1 :(得分:0)
以下解决方案对我有效。 Zip
未被两次调用
willTransition