Я начал использовать angular2 (с backend файлом express.js) с целью передать управление несколькими разделами страницы компонентам angular2, но в конце концов понял, что система намного эффективнее, если angular2 контролирует всю область страницы. Тем не менее, мое приложение не является SPA, и кроме маршрута, содержащего селектор моего корневого компонента angular2, есть другие серверные маршруты.
У меня есть 2 вопроса, а затем фрагменты кода:
-
Всякий раз, когда я загружаю серверный маршрут, чей серверный визуализированный шаблон не содержит селектор моего корневого компонента,
<main-comp></main-comp>
, angular2 в основном запутывает консоль, говоря, что ей негде инициализации. Я поместил весь свой код инициализации angular2 в общий заголовок для всего моего приложения. Есть ли способ сказать корневому компоненту angular2 не отображать себя, если его селектор просто не существует на странице? -
Маршрут на стороне сервера, который отображает корневой компонент angular2, составляет
/writing
, а URL-адрес маршрутизации angular2 для определенного сообщения в блоге - это что-то вроде/writing/2016/03/post
. Однако, всякий раз, когда я просматриваю URL-адрес, System.js пытается загрузить приложение/загрузку относительно этого местоположения, то есть/writing/2016/03/app/boot
, что, очевидно, не с 404. Я думаю, что это происходит, потому что мой сервер управляет/writing
route и angular загружается относительно базового URL-адреса, запрашиваемого на сервере. Таким образом, единственным решением, которое я знаю, было бы превращение моего приложения в SPA с одним маршрутом сервера, который был бы'/'
, что потребовало бы много переписывания на передний план. Как я могу обойти эту проблему?
Это мой корневой компонент:
@Component({
selector: 'main-comp',
template: '<router-outlet></router-outlet>',
providers: [TagService, PostService, BlogStateService],
directives: [ROUTER_DIRECTIVES, BlogComponent]
})
@RouteConfig([
{path: '/writing/...', name: 'Blog', component: BlogComponent }
])
export class AppComponent {
constructor(private _blogState : BlogStateService,
private _postService : PostService) {
}
}
И вот элемент <head>
:
<head>
<script src="/js/jquery.min.js"></script>
<script src="/js/modernizr-2.6.2-respond-1.1.0.min.js"></script>
<!-- Angular Dependencies -->
<script src="/app/node_modules/angular2/bundles/angular2-polyfills.js"></script>
<script src="/app/node_modules/es6-shim/es6-shim.js"></script>
<script src="/app/node_modules/systemjs/dist/system.src.js"></script>
<script src="/app/node_modules/moment/moment.js"></script>
<script>
System.config({
packages: {
app: {
format: 'register',
defaultExtension: 'js'
},
moment: {
main: 'moment.js',
type: 'cjs',
defaultExtension: 'js'
}
},
map: {
moment: '/app/node_modules/moment/'
}
});
</script>
<script src="/app/node_modules/rxjs/bundles/Rx.js"></script>
<script src="/app/node_modules/angular2/bundles/angular2.dev.js"></script>
<script src="/app/node_modules/angular2/bundles/http.dev.js"></script>
<script src="/app/node_modules/angular2/bundles/router.dev.js"></script>
<script>
System.import('app/js/boot').then(null, console.error.bind(console));
</script>
<base href="/">
</head>