AngularDart [routerLink] не добавляет родительский путь - PullRequest
0 голосов
/ 15 мая 2018

Я строю несколько простых дочерних маршрутов в AngularDart 5. Приложение содержит следующие компоненты:

  • login_register_component -> localhost:8080/#/portal
  • login_component -> localhost:8080/#/portal/login
  • register_component -> localhost:8080/#/portal/register

Навигация к этим компонентам путем вставки подходящего URL-адреса в адресную строку работает нормально, но переход к ним с использованием привязки HTML и директивы [routerLink] не работает, поскольку [routerLink] не добавляет префикс URL-адреса дочернего компонента к путь родительского компонента (/portal).

У меня есть два из этих якорей в login_register_component:

<nav>
    <a [routerLink]="routes.login.path">{{i18n.login}}</a>
    <a [routerLink]="routes.register.path">{{i18n.register}}</a>
</nav>
<router-outlet [routes]="routes.all"></router-outlet>

дочерний файл route_paths:

import 'package:angular_router/angular_router.dart';

import '../route_paths.dart' as parent_route_paths;

final login = new RoutePath(
    path: 'login',
    parent: parent_route_paths.portal
);

final register = new RoutePath(
    path: 'register',
    parent: parent_route_paths.portal
);

Файл дочерних маршрутов:

import 'package:angular_router/angular_router.dart';
import 'login_register_route_paths.dart' as paths;
import 'login/login_component.template.dart' as login_component_template;
import 'register/register_component.template.dart' as register_component_template;


class LoginRegisterRoutes {
  static final _login = new RouteDefinition(
    routePath: paths.login,
    component: login_component_template.LoginComponentNgFactory
  );

  static final _register = new RouteDefinition(
    routePath: paths.register,
    component: register_component_template.RegisterComponentNgFactory
  );

  static final _default = new RouteDefinition.redirect(
      path: '',
      redirectTo: paths.login.toUrl()
  );

  RouteDefinition get login => _login;
  RouteDefinition get register => _register;

  final List<RouteDefinition> all = [
    _login,
    _register,
    _default
  ];
}

Их ссылка в браузере выглядит следующим образом:

  • localhost:8080/#/login вместо localhost:8080/#/portal/login
  • localhost:8080/#/register вместо localhost:8080/#/portal/register

Я следовал руководству по маршрутизации AngularDart 5, чтобы добиться этого: https://webdev -dartlang-org-dev.firebaseapp.com / угловой / гид / маршрутизатор / 1 # appcomponent-навигация

EDIT : Взгляните на исходный код RouteDefinition и RoutePath ..

RouteDefinition toUrl ():

String toUrl([Map<String, String> paramValues = const {}]) {
    if (isDevMode && paramValues == null) {
      throw new ArgumentError.notNull('paramValues');
    }
    var url = '/' + path;
    for (final parameter in parameters) {
      url = url.replaceFirst(
          ':$parameter', Uri.encodeComponent(paramValues[parameter]));
    }
    return url;
  }

RoutePath toUrl ():

 String toUrl({
    Map<String, String> parameters,
    Map<String, String> queryParameters,
    String fragment,
  }) {
    // Don't pass parameters to parent URL. These are populated only once the
    // complete URL has been constructed.
    final parentUrl = parent != null ? parent.toUrl() : '/';
    var url = Location.joinWithSlash(parentUrl, path);
    if (parameters != null) {
      for (final key in parameters.keys) {
        url = url.replaceFirst(':$key', Uri.encodeComponent(parameters[key]));
      }
    }
    return new Url(url, queryParameters: queryParameters, fragment: fragment)
        .toString();
  }

Использование RouteDefinition toUrl () никогда не будет работать, просто RoutePath toUrl () включает путь родителей.

...