Я строю несколько простых дочерних маршрутов в 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 () включает путь родителей.