加载应用程序时,在Durandal路由器中动态添加/删除路由

时间:2013-04-08 14:09:50

标签: durandal

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

我尝试在visibleRoutes / allRoutes数组中添加/删除路由...但是从淘汰库中获取绑定异常......

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

感谢。 Wasim

发表评论:

我尝试了这个功能来动态隐藏/显示路线......类似的尝试添加/删除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 个答案:

答案 0 :(得分: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属性重建路由数组。

答案 1 :(得分:2)

在Durandal 2.0中。

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

然后更改:nav property

的值

然后运行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;
    }
 }

答案 2 :(得分:0)

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

两个选项,(我同时使用) 1)让json服务为每个用户类型提供适当的路由,如果你需要'保护/隐藏'路由,这种方法会很好...即我不想在任何客户端资源上引用路由。 2)更简单的解决方案请参阅Durandal.js: change navigation options per area 您可以使用settings属性标识用户类型。

我希望这会有所帮助。

答案 3 :(得分:0)

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

因此,您所要做的就是找到要删除的数组中的哪个项目,然后在不使用此项目的情况下创建数组,并设置{{ 1}}到这个新数组。

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

router.visibleRoutes()

请注意router.visibleRoutes(router.visibleRoutes().splice(2, 1)) 会返回一个删除项目的新数组。这个新数组放入splice()