我开始使用 Angular2(带有 Express.js 后端),目的是将页面的几个部分的控制权传递给 Angular2 组件,但我最终意识到,当 Angular2 控制页面的整个区域时,系统会更有效。但是,我的应用程序不是 SPA,除了保存 Angular2 根组件选择器的路由之外,还有其他服务器渲染的路由。
我有两个问题,后面是代码片段:
每当我加载服务器控制的路由,其服务器端渲染模板不包含我的根组件的选择器时,<main-comp></main-comp>
, angular2 基本上会吐到控制台,说它没有任何地方可以初始化。我将所有 Angular2 初始化代码放在整个应用程序的共享标头中。如果页面上不存在选择器,有没有办法告诉 Angular2 根组件不要渲染自身?
渲染 Angular2 根组件的服务器端路由是/writing
特定博客文章的 angular2 路由 URL 类似于/writing/2016/03/post
。但是,每当我直接浏览到该 URL 时,System.js 都会尝试加载相对于该位置的 app/boot,即/writing/2016/03/app/boot
,这显然会失败并返回 404。我认为发生这种情况是因为我的服务器控制了/writing
相对于向服务器请求的基本 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>