【问题标题】:durandaljs child router deactivate eventdurandaljs 子路由器停用事件
【发布时间】:2016-03-30 02:09:25
【问题描述】:

当父路由改变时如何触发 deactivate 事件。 例如,在“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;
});

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

【问题讨论】:

    标签: durandal durandal-navigation


    【解决方案1】:

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

    更新

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

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

    【讨论】:

    • CanDeactivate 在 HTML 示例中返回 false,但如果我通过导航菜单更改路线,则此方法不会执行。
    • 并且在更改父路由期间不会为 childRouter 的路由触发 canDeactivate。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      相关资源
      最近更新 更多