我有一个编辑页面(在DurandalJS单页面应用程序中),我使用.canDeactivate
生命周期方法检查记录是否有任何更改,并可选择在离开页面之前提示确认。
我还有一个“保存”和“查看历史记录”按钮。在调用.canDeactivate
之前覆盖router.navigate
方法,停止模式弹出调用是正确的做法吗?
例如:在这里:
self.onSave = function() {
self.repository.updateItem(self.model).done(function() {
self.canDeactivate = null; // Is this the correct way to do this?
router.navigate("#/home");
}
}
因为这个.canDeactivate会被调用:
self.canDeactivate = function() {
if (!self.model.hasChanges()) {
return true;
}
return app.ShowMessage("Unsaved data will be lost", "Are you sure you wish to exit?", ["Yes", "No"]).done(function(result) {
return result !== "No";
}
};
答案 0 :(得分:1)
为什么不设置
self.model.hasChanges(false)
你的updateItem回调中的?
然后,当调用canDeactivate时,它将返回true。
此外,您的ShowMessage回调似乎也有错误。我想你的意思是:
return result != "No";
答案 1 :(得分:1)
我不认为Durandal决定是否尝试调用canDeactivate
函数的方式是完全定义的,除了如果它不在视图模型中,它将不会尝试。因此,即使它按原样工作,框架的未来版本也可以将其检查更改为if (canDeactivate in viewModel) viewModel.canDeactivate(...);
而不进行进一步测试,并且您的代码会中断。
这不太可能,但如果你想担心它,那么你应该delete self.canDeactivate
而不是为它赋予null
值。
来自文档的引用:
要参与生命周期,请实施任何(或不执行) 以下函数在您将激活器设置为(...)
的对象上
目前的实施(activator.js,L126,1eecbc2d3f84dc42eb7304bde761d88f300d8951):
if (item && item.canDeactivate) {
所以它只检查它是否真实(这表明使用null
当前工作正常)。
如果你想讨论这种模式,我认为它没有任何问题,只要它对你和每个应该阅读代码的人都有意义。
您不应该在任何关键路径中以编程方式激活和停用视图,因此性能应该是无关的(视图模型上的标记或canDeactivate
的删除)。