AngularDart路由,其中​​参数包含斜杠

时间:2014-06-02 14:12:38

标签: dart angular-dart

我是Angular和Dart的新手,我正在编写一个具有分层次类别的应用程序。这可以用它们的ID来表示,该类别是该类别(包括其父级)的路径的斜线删除列表 - 换句话说,顶级类别的“category-1”,a的“category-1 / category-2”孩子,孙子的'category-1 / category-2 / category-3'。

我希望我的网址方案能够反映这种层次结构(即类别2,'#categages / category-1 / category-2')。

这是我当前的RouteInitializerFn(我正在控制器中为'categories'取出'categoryId'参数):

void routeInitializer(Router router, RouteViewFactory views) {
  views.configure({
    'subcategories' : ngRoute(
        path: 'categories/:categoryId',
        viewHtml: '<categories></categories>',
    ),
    'categories': ngRoute(
        path: 'categories',
        viewHtml: '<categories></categories>',
    ),
  });
}

但这似乎会在斜线上绊倒; URL'#categages / category-1 / category-2'的'categoryId'值为'category-1'。

AngularJS文档建议这可以在JS land(https://docs.angularjs.org/api/ngRoute/provider/ $ routeProvider - 'path'参数的文档中);我已经尝试改变我的路径,找到没有任何运气的各种排列,也无法在问题跟踪器中找到任何相关内容。

有什么想法吗?

编辑:

好的,我想我已经弄明白了。罪魁祸首是https://github.com/angular/route.dart/blob/master/lib/url_template.dart#L6 - 具体而言,与参数值匹配的正则表达式是“除字符串开头之外的任何字符或/”至少一次。我认为解决方法是将正则表达式更改为r'\?(。+)'(所有旧的单元测试仍然通过,我修改的新单元测试也是如此)。

不幸的是,它似乎没有临时的解决方法。你不能交换UrlMatcher的不同实现,因为UrlTemplate的使用被纳入ngRoute方法;如果要将NgRouteCfg的'path'参数更改为动态类型并断言它是String或UrlMatcher(这是route_hierarchical所做的内容,所以你可以直接传递它)这也是一个合理的解决方案,但目前看起来前进的道路是固定在头上。

1 个答案:

答案 0 :(得分:1)

Angular-Dart教程也有一些信息

见:

  

mount参数允许您定义嵌套路由。

void recipeBookRouteInitializer(Router router, RouteViewFactory views) {
  views.configure({
    'add': ngRoute(
        path: '/add',
        view: 'view/addRecipe.html'),
    'recipe': ngRoute(
        path: '/recipe/:recipeId',
        mount: {
          'view': ngRoute(
              path: '/view',
              view: 'view/viewRecipe.html'),
          'edit': ngRoute(
              path: '/edit',
              view: 'view/editRecipe.html'),
          'view_default': ngRoute(
              defaultRoute: true,
              enter: (RouteEnterEvent e) =>
                  router.go('view', {},
                      startingFrom: router.root.findRoute('recipe'),
                      replace: true))
        })
  });
}