Я хотел задать тот же вопрос, но вы были первыми! Я нашел решение, возможно, не самое лучшее, но, по крайней мере, оно работает.
Я создал один HTML для всех маршрутов:
dyn_view.html:
<div><dynamic-view></dynamic-view></div>
и конечно компонент динамической точки зрения, которая принимает реальное имя компонента тег от поставщика маршрута и динамически добавляет к DOM с использованием методики, описанной здесь: How to add a component programatically in Angular.Dart?
dynamic_view.html
<div></div>
dynamic_view.dart
@NgComponent(
selector: 'dynamic-view',
templateUrl: 'view/dynamic_view.html'
)
class DynamicView implements NgShadowRootAware {
Compiler compiler;
Injector injector;
String elementName;
DynamicView(this.compiler, this.injector, RouteProvider provider) {
elementName = provider.parameters["elementName"];
}
void onShadowRoot(ShadowRoot shadowRoot) {
DivElement inner = shadowRoot.querySelector("div");
inner.appendHtml("<$elementName></$elementName>");
BlockFactory template = compiler(inner.nodes);
var block = template(injector);
inner.replaceWith(block.elements[0]);
}
}
Теперь маршрутизатор. Имя элемента должно быть передано каким-либо образом в RouteProvider. Я был вдохновлен этой должности: Verifying route preconditions prior to loading controller
class DynamicViewFactory {
ViewFactory viewFactory;
DynamicViewFactory(this.viewFactory);
call(String elementName) {
return (RouteEvent event) {
event.parameters["elementName"] = elementName;
viewFactory("view/dyn_view.html")(event);
};
}
}
class MyRouteInitializer implements RouteInitializer {
init(Router router, ViewFactory view) {
DynamicViewFactory dynView = new DynamicViewFactory(view);
router.root
..addRoute(
name: 'route1',
path: '/a/:b',
enter: dynView('componentA'))
..addRoute(
name: 'route2',
path: '/b/:c',
enter: dynView('componentB'));
}
}
Приведенный выше код немного изменен от того, что на самом деле я использую, так что он может иметь некоторые мелкие ошибки, но общая идея та же.
Надеюсь, что это поможет!
Круто! Интересно, можете ли вы отправить это как пакет паба, чтобы я и другие могли его использовать. Если вы опубликуете его, сообщите мне. –
Как выглядит ваш модуль? Я не получаю свой RouteProvider, введенный в DynamicView. –
Мое приложение основано на Angular tutorial: https://github.com/angular/angular.dart.tutorial/tree/master/Chapter_06. Модуль выглядит следующим образом: ' класс MyModule расширяет модуль { MyModule() { type (QueryService); тип (DynamicView); // комплектующие тип (ApplicationComponent); тип (ScreenComponent); ... тип (RouteInitializer, реализованныйBy: MyRouteInitializer); завод (NgRoutingUsePushState, (_) => новый NgRoutingUsePushState.value (false)); } } ' –