3

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

谢谢弗拉基米尔。

升级版:

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

项目.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;
});

现在您不能使用选择控件更改详细视图。但可以通过导航面板轻松更改整个模块。

4

2 回答 2

1

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

更新

路由器中有一个错误,即 wontfix,当父 viewModel 被停用/导航离开时,子 viewModel 没有正确停用。见这里:https ://github.com/BlueSpire/Durandal/issues/570

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

于 2013-10-03T14:28:05.833 回答
1

这是一个超级迟到的回答。我正在维护一个现有的 durandal 应用程序。我的快速解决方法是在父视图模型的停用中手动调用子视图模型的停用。但是,子 deactivate 可能会被调用多次。

Shell.prototype.deactivate = function(){
    this.router.activeItem().deactivate();
}; 
于 2016-03-29T17:52:47.310 回答