【问题标题】:Angular Conditional Routing角度条件路由
【发布时间】:2015-07-24 03:33:57
【问题描述】:

我正在开发一个有点简单的聊天应用程序来熟悉 node/angular,但我通常是一名 PHP 开发人员。我现在要做的是,如果有人要去一个不存在的房间,他们会收到一个带有简单“房间不存在”错误消息的页面。但如果它确实存在,他们将能够加入房间。

现在,我一直在做的是在视图中使用ngIf,如果服务器响应它不存在则显示错误消息,如果存在则显示聊天。

我只是不太关心它是如何工作的。也许只是因为我的背景正常,但是纯粹根据数据返回的内容将相同的视图用于多种目的感觉很奇怪。这似乎是一个不太优雅的解决方案。

我将其用作带有 ngRoute 的单页应用程序。有没有办法通过 Routes 或其他一些方法,我可以在路由触发之前检查房间并基于此重定向?

【问题讨论】:

  • 假设您在路由配置中使用 resolve 块来查找房间(通过 API 或类似方法),如果房间不存在,您总是会遇到解析失败并捕获它在$routeChangeError 事件处理程序中

标签: angularjs node.js express socket.io


【解决方案1】:

在应用程序的运行块中,您可以观看$routeChangeStart 事件,该事件在您开始更改路线时触发。现在是在新路由加载之前处理您需要的任何逻辑的好时机。

$routeChangeStart:在路由更改之前广播。此时 路由服务开始解决所有需要的依赖 发生路线变化。通常这涉及获取视图 模板以及解析路由中定义的任何依赖项 财产。解决所有依赖项后 $routeChangeSuccess 被触发。

您可以调用event.preventDefault() 让它中止路由更改并允许您运行所需的任何逻辑。然后,您可以根据您的逻辑解析方式有条件地路由到您需要的任何位置。

你可以这样做:

app.run(function($rootScope, $location) {
    $rootScope.$on("$routeChangeStart", function (event, next, current) {
        event.preventDefault();
        if (myRoom) { 
            $location.path('myRoom')
        } else {
            $location.path('noRoom');
        }
});

如果我没记错的话,您可能需要将您的 $location 更改包装在 $timeout 函数中以使其触发。

$timeout(function() {$location.path('myRoom')},0);

注意:您可以在$routeChangeStart 事件的next 参数中访问有关您要去的路线的详细信息,因此如果您需要获取有关他们试图导航到哪个房间的详细信息,您可以获取它从那里开始。

【讨论】:

  • 感谢您的建议!我什至不知道 app.run()。我会尝试这样的事情,看看我能得到什么。
  • Phil 也是正确的 - 您也可以在路线的 resolve 中添加逻辑。
  • 我还在答案的末尾添加了一条注释,这可能对您尝试做的事情很重要。
  • 刚刚实现了与此非常相似的东西,它的工作方式与我想要的完全一样。非常感谢!
猜你喜欢
  • 2016-05-04
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 2018-11-28
  • 2019-02-14
相关资源
最近更新 更多