durandaljs子路由器停用事件

时间:2013-10-03 08:33:59

标签: durandal durandal-navigation

如何在父路线更改时触发停用事件。 例如,在“HTML示例”中,当“主 - 详细信息”页面处于活动状态时,将视图更改为另一个。 如何强制对话“你想离开......”吗?

由于 弗拉基米尔。

UPD:

带有替换对话框的HTML示例代码

project.js

define(['durandal/system', 'durandal/app'], function (system, app) {
    var ctor = function (name, description) {
        this.name = name;
        this.description = description;
    };

    ctor.prototype.canActivate = function () {
        return true; //!!! CHANGED!!!
    };

    ctor.prototype.activate = function () {
        system.log('Model Activating', this);
    };

    ctor.prototype.canDeactivate = function () {
        return false; //!!! CHANGED!!!
    };

    ctor.prototype.deactivate = function () {
       system.log('Model Deactivating', this);
    };

    return ctor;
});

现在,您无法使用选择控件更改详细信息视图。 但很容易通过导航面板更改整个模块。

2 个答案:

答案 0 :(得分:1)

您正在寻找的是canDeactivate属性。您可以使用对话框插件显示对话框。如果canDeactivate函数返回true,则视图将停用。如果返回false,则视图将保留。

<强>更新

路由器中的一个错误,即wontfix,当父视图模型被停用/导航时,子视图模型未正确停用。见这里:https://github.com/BlueSpire/Durandal/issues/570

请参阅 http://durandaljs.com/documentation/Using-Activators/ http://durandaljs.com/documentation/Hooking-Lifecycle-Callbacks/

答案 1 :(得分:1)

这是一个超级迟到的回答。我正在维护一个现有的durandal应用程序。我的快速修复是在父项的停用中手动调用子视图模型的停用。但是,可以多次调用子项停用。

Shell.prototype.deactivate = function(){
    this.router.activeItem().deactivate();
};