【问题标题】:Dynamically Adding / Removing Route in Durandal Router when application is loaded加载应用程序时在 Durandal 路由器中动态添加/删除路由
【发布时间】:2013-04-08 14:09:50
【问题描述】:

我需要在 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);
            }
        }
    }

【问题讨论】:

  • 请发布一些代码,说明您是如何尝试执行此操作的、遇到了什么错误以及所述代码的任何上下文。
  • @Kal_Torak 请查看我更新后的帖子以及我尝试过的代码
  • 请发布错误。此外,设置theRoute=this; 看起来非常可疑。我想在上面设置一个断点来仔细检查,但我怀疑它会给你带来你期望的结果。我建议查看 router.js 文件以查看添加新路由的签名。
  • 这个函数是用'router.js'编写的,函数中的“this”指向我想要显示/隐藏的路由,这是我得到的异常“---未捕获的错误:无法解析绑定。消息:ReferenceError:isActive 未定义;绑定值:css:{ active:isActive } ---" 在该函数执行后
  • 那么您是否注意过该错误并检查以确保在您的视图模型上定义了 isActive 属性? KO 错误信息量很大。

标签: durandal


【解决方案1】:

在杜兰达尔 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;
    }
 }

【讨论】:

    【解决方案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 属性来重建路由数组。

    【讨论】:

      【解决方案3】:

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

      两个选项,(我两个都用) 1) 让 json 服务为每个用户类型提供正确的路由,如果您需要“保护/模糊”路由,这种方法会很好......即我不希望在任何客户端资源上引用该路由。 2)更简单的解决方案见Durandal.js: change navigation options per area 您可以让设置属性识别用户类型。

      我希望这会有所帮助。

      【讨论】:

        【解决方案4】:

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

        所以,你要做的就是在这个数组中找到你要删除的项,然后创建一个new数组没有这个项,并设置@987654322 @ 到这个新数组。

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-13
          • 2020-09-22
          • 1970-01-01
          • 1970-01-01
          • 2018-11-14
          • 2012-05-31
          相关资源
          最近更新 更多