4

我需要帮助在 Durandal 路由器中动态添加/删除路由。我想要的是在用户登录后,我将能够根据登录用户的类型添加或删除特定路线。

我试图从 visibleRoutes/allRoutes 数组中添加/删除路由......但从淘汰赛库中获得绑定异常......

我希望这将是常见的情况......但仍然找不到任何解决方案......请帮助我解决这个问题。

谢谢。瓦西姆

发表评论:

我尝试使用此功能来动态隐藏/显示路线...并且类似地尝试从 allRoutes[] 添加/删除路线...但随后在淘汰赛出价时出现异常

showHideRoute: function (url,show) {

        var routeFounded = false;
        var theRoute = null;
        $(allRoutes()).each(function (route) {

            if (url === this.url) {
                routeFounded = true;
                var rt = this;
                theRoute = rt;
                return false;
            }
        });

        if (routeFounded)
        {
            if (show)
            {
                visibleRoutes.push(theRoute);
            }
            else
            {
                visibleRoutes.remove(theRoute);
            }
        }
    }
4

4 回答 4

2

Durandal 2.0 不再有该方法visibleRoutes。我发现以下内容对我有用。

router.reset();
router.map([
        { route: 'home', moduleId: 'home/index', title: 'Welcome', nav: true },
        { route: 'flickr', moduleId: 'flickr/index', title: '', nav: true }
])
.buildNavigationModel()
.mapUnknownRoutes('home/index', 'not-found');

这将删除所有以前的路线,如果您想维护当前路线,您可以尝试使用该router.routes属性来重建路线数组。

于 2014-01-31T01:59:23.490 回答
2

在杜兰达尔 2.0.

您可以枚举路线以找到您希望显示/隐藏的路线。

然后改变:nav属性的值

然后运行 ​​buildNavigationModel();

这是一个例子:

// see if we need to show/hide 'flickr' in the routes
for (var index in router.routes) {
    var route = router.routes[index];
    if (route.route == 'flickr') {
         if (vm.UserDetail().ShowFlickr) { // got from ajax call
            // show the route
            route.nav = true;  // or 1 or 2 or 3 or 4; to have it at a specific order
         } else if (route.nav != false) {
            route.nav = false;
         }
         router.buildNavigationModel();
        break;
    }
 }
于 2014-05-01T04:49:49.110 回答
0

我有类似的要求。如果我是你,我会采取另一种方法。而不是在应用程序加载时添加/删除路由 - 从每个用户类型开始获取正确的路由。

两个选项,(我同时使用)1)有一个 json 服务为每个用户类型提供正确的路由,如果您需要“保护/模糊”路由,这种方法会很好......即我不希望引用的路由任何客户端资源。2) 更简单的解决方案参见Durandal.js:更改每个区域的导航选项 您可以使用设置属性识别用户类型。

我希望这有帮助。

于 2013-04-18T16:03:55.890 回答
0

我有一个类似的问题:首先,router.visibleRoutes()是一个可观察的数组。换句话说,当你改变它的值时,路由会自动更新。但是,此数组中的项目是不可观察的,因此要进行更改,您需要替换整个数组,而不仅仅是更改其中的单个项目。

所以,你所要做的就是在这个数组中找到你想要删除的项目,然后创建一个没有这个项目的数组,并设置到这个新数组。router.visibleRoutes()

例如,如果您发现它是第三项,那么一种方法是:

router.visibleRoutes(router.visibleRoutes().splice(2, 1))

请注意,它splice()返回一个新数组,其中删除了一个项目。这个新数组被放入router.visibleRoutes.

于 2013-07-30T13:21:46.330 回答