【问题标题】:Nested routes in Angular DartAngular Dart 中的嵌套路由
【发布时间】:2014-01-19 18:25:38
【问题描述】:

我有一个路由方案,其中#/articles 导致articles.html 视图,#/articles/featured 导致featured.html。不过,我不确定如何声明这种嵌套写作。如果我按如下方式配置我的路由,#/articles#/articles/featured 都会导致articles.html(因为两个路径都匹配 r'^articles')。

library my_router;

import 'package:angular/angular.dart';

class MyRouteInitializer implements RouteInitializer {
  init(Router router, ViewFactory view) {
    router.root
      ..addRoute(
          name: 'articles',
          path: '/articles',
          enter: view('views/articles.html'),
          mount: (Route route) => route
            ..addRoute(
                name: 'featured',
                path: '/featured',
                enter: view('views/featured.html'))

      );
  }
}

如果我省略 enter: view('views/articles.html') 行,#/articles/featured 路由正确路由到 featured.html,但没有任何路由到 articles.html

【问题讨论】:

    标签: dart angular-dart


    【解决方案1】:

    当您定义嵌套视图时,预计它们将由嵌套的ng-views 呈现,但这似乎并不是您真正想要的。您使用扁平结构的解决方法可能没问题。或者,您可以执行以下操作:

    class MyRouteInitializer implements RouteInitializer {
      init(Router router, ViewFactory view) {
        router.root
          ..addRoute(
              name: 'articles',
              path: '/articles',
              mount: (Route route) => route
                ..addRoute(
                    name: 'all',
                    path: '/all',
                    default: true,
                    enter: view('views/articles.html')
                ..addRoute(
                    name: 'featured',
                    path: '/featured',
                    enter: view('views/featured.html'))
          );
      }
    }
    

    【讨论】:

    • 谢谢,很有帮助。
    • 你能用嵌套的ng-views 修改这个例子吗
    • @pavelgj 我的主页只有一个 ng-view。尽管路由在逻辑上是嵌套的,但它们不会由嵌套的 ng-views 呈现。那么,我的路由器应该是什么样子。建议在路由器中使用嵌套结构还是应该使用扁平结构? [问题是关于假设这两种方法在这种情况下都有效的最佳实践]
    【解决方案2】:

    我可以通过避免 mount 并定义从特定到一般的路线来实现此功能,但该解决方案似乎笨拙且容易出错。正确的方法是使用mount 并正确嵌套路由,但我无法让它工作。同时,这里有一个临时解决方案:

    import 'package:angular/angular.dart';
    
    class MyRouteInitializer implements RouteInitializer {
      init(Router router, ViewFactory view) {
        router.root
          ..addRoute(
              name: 'featured',
              path: '/articles/featured',
              enter: view('views/featured.html'))
          ..addRoute(
              name: 'articles',
              path: '/articles',
              enter: view('views/articles.html'));
      }
    }
    

    【讨论】:

    • 这个重复的“/articles”路径前缀不会触发多个匹配,从而不会发生路由吗?
    • 路由按顺序匹配。因此,“/articles/featured”映射到“views/featured.html”,“/articles”映射到“views/articles.html”。不过,我会推荐接受的答案作为要走的路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 2023-03-08
    • 1970-01-01
    • 2020-05-16
    • 2019-08-04
    相关资源
    最近更新 更多