Durandal 子路由器重新激活所有级别直到 root

Durandal Child router re-activate all level up to root

我们正在使用 durandaljs 开发一个应用程序,我们似乎有子路由器的问题,或者至少是我们不理解或无法弄清楚的问题。让我们从一个例子开始。

Route => /part1/:id/part2/:id2/part3

问题是,导航时在每一级路由上都调用了 main.js activate 方法:

= Root (activate called)
== Part1 (activate called)
=== Part 2 (activate called)
==== Part 3 (activate called (normal since this is the initiator of everything else since that's where we have navigating to, no more child router declare here as it live in the child router declare in Part2))

我们发现这种行为有点奇怪,想知道这是否是正常行为,或者我们是否在此处对子路由器做错了什么。为什么每个子关卡都需要重新运行他们的激活方法? IHMO,只有我们导航到的当前模型应该触发他的激活方法,任何其他子页面都不应该触发此事件。

我们正在使用最新的 DurandalJS,即 2.1.0,我们正在使用 Typescript 构建应用程序,但我认为它不会改变这里的内容。

这是正常行为。每当激活子级时,激活函数就会在整个层次结构中传播。这确实匹配停用行为。在父项仍被实例化时停用子项不会调用父项上的停用。

处理此问题的最佳方法是打开激活器回调的参数,因为激活参数会传递给每个激活器回调。因此,对于第 1 部分,您可能

activate(id1, id2) {
    if (id1 === null && id2 === null) {
        // logic
    }
}

这错过了您导航到 /part1//part2 的边缘情况,因此如果您担心这一点,您可以在根路由器上使用正则表达式进行更可靠的检查。

import router = require('plugins/router');
activate(id1, id2) {
    var route = /^part1\/?$/;
    if (route.test(router.activeInstruction)) {
        // logic
    }
}