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

时间:2015-02-19 14:03:51

标签: durandal durandal-navigation

我们正在使用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 个答案:

答案 0 :(得分:1)

这是正常行为。每当激活子项时,激活功能在整个层次结构中传播。这匹配停用行为。在父实例化时仍然实例化停用子项不会调用父项的停用。

处理此问题的最佳方法是打开激活器回调的参数,因为激活参数会传递给每个激活器回调。因此,对于第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
    }
}