1

使用以下 Durandal子路由器插件配置时,我没有收到Durandal 生命周期中描述detached的和activate事件,而其他事件有效。

它是一个单页应用程序,其中包含容器的childRouter控制内容。div每个childRouter对应一个模块,一次应该只有一个attached,而其他应该是detached.

该应用程序为每个模块使用单独的childRouter实例,我希望每次发生两个模块之间的导航时都会触发detachedandactivate事件(即moduleOLDshould getdetachedmoduleNEWshould get attached)。

文档说 Durandal 生命周期事件是自动触发的:

以绿色突出显示的行将在撰写时始终执行。

它不能以这种方式工作,这可能是由以下原因引起的:

  • 子路由器没有收到关于彼此连接/分离的通知(即需要订阅某些事件)
  • 子路由器的工作方式与父路由器不同

看来我必须手动分离某些东西,或者通知正在更换的路由器,才能触发detachedactivate.

如何触发detachedactivate事件childRouter

define([ 'durandal/app', 'plugins/router'], function(
        app, router) {
    var childRouter = router.createChildRouter();
    childRouter.makeRelative({
        moduleId : 'modules/moduleX/pages',
        fromParent : true
    });
    childRouter.map([ {
        route : [ '', 'grid' ],
        moduleId : 'grid/index',
    }, {
        route : 'details/:id',
        moduleId : 'details/index',
    }, {
        route : 'details/tabs/base',
        moduleId : 'details/tabs/base',
    } ]);
    childRouter.buildNavigationModel();
    childRouter.activate = function() {
        console.log("activate");//DOESN'T WORK
    };
    childRouter.attached = function() {
        console.log("attached");//WORKS
    };
    childRouter.compositionComplete = function() {
        console.log("compositionComplete");//WORKS
    };
    childRouter.detached = function() {
        console.log("detached");//DOESN'T WORK
    };
    return {
        router : childRouter
    };
});

输出(无错误):

compositionComplete (gets called here too, when a route is first visited)
attached
compositionComplete
4

1 回答 1

0

在 Durandal 中,激活生命周期是特定于activator的。每个路由器和子路由器在activeItem中都有一个,它还充当该路由器上当前激活的模块的访问器。

Durandal 确保在每个模块更改或即将更改任何当前活动路由器上的活动项目时,在每个模块上正确调用生命周期中的事件,然后在/如果它将数据绑定到模块的视图并将其附加到DOM 文档。

要按预期触发事件,应在需要此类处理程序的每个模块上声明具有相应名称的方法。

激活发生在所有子路由器上,但​​从根路由器开始分步进行。因此,当为新路由选择模块时,根路由器将询问其当前活动模块是否可以停用,这将链接到子路由器中的所有活动模块。然后它会询问新模块是否可以激活。如果两者都允许,激活将通过并且根路由器上的活动项目将更改,触发模块上的停用/激活方法(如果存在)。如果路由比匹配的片段多,并且激活的模块有一个子路由器,则其上的子路由也将被触发。

当同一个模块在激活中被重用时,事件链仍然被触发,但它可能会发生,如果子路由器没有收到匹配的模块,在子路由器中激活的某些模块上的deactivate方法可能不会触发从新路线。例如,如果子路由器未配置为空路由 ('') 并且导航更改回父路由,例如从products/item/15返回products到切换到,这意味着匹配的任何父模块products仍将具有旧模块item 15在其子路由器上保持激活状态。为了避免在重用模块时出现这种情况,一种选择是始终在子路由器上配置空路由 ('')。如果有的话,将其与具有空白视图的模块匹配,例如空的div.

于 2016-02-17T10:35:46.827 回答