Durandal - 正确禁用.canDeactivate进行“成功”操作的方法?

时间:2014-03-11 04:40:20

标签: durandal

我有一个编辑页面(在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";
    }
};

2 个答案:

答案 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的删除)。