**目标:**如果当前路线的模型已更改(即,用户已更新某些字段但未保存,即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
框中选择取消时(即“取消过渡以便我可以完成编辑”),确认框再次弹出。再次取消会使它永远消失,但我不知道为什么它会被点击两次。如果我第一次在确认框中说“确定”,它会继续进行过渡,而不会再次弹出确认框。只有在第一次取消时,它才会立即再次弹出。
我试着在www.example.com上复制ember-twiddle.com,但是它在那里运行得很好,只调用了willTransition
一次。如果它在我的代码中确实被调用了两次,我也不知道为什么,因为我已经检查了又检查了两次,我看不到任何不同的地方会导致在transition.abort()
运行后再次调用钩子。
有线索吗?
EDIT我进一步简化了willTransition
,它仍然运行了两次。看起来transition.abort()
调用了willTransition()
,尽管这没有意义!
actions: {
willTransition: function(transition) {
console.log('trying to transition');
transition.abort();
}
}
}
//logs 'trying to transition' to the console twice!
2条答案
按热度按时间mrzz3bfm1#
对于任何可能有类似问题的人:
我在调用
transition.abort()
(试图处理未保存的更改)时遇到了willTransition
被触发两次的问题。在我的例子中,这个问题与我从
willTransition
返回true
这一事实有关(无论我是否处理未保存的更改)。一旦我将
return true;
移到hasChanges
if
语句的else条件中,问题就解决了。x9ybnkn62#
下面的解决方案对我很有效。
willTransition
不会被调用两次