Angular2路由器:改变路由首次加载组件

时间:2016-04-21 10:58:00

标签: nginx angular systemjs angular2-routing angular2-directives

我正在改变角度2应用的路线来自' /'到' / xyz'。对于' xyz'我创建了一个名为XYZComponent的组件。此XYZComponent实现了一个名为" CanActivate"的路由器生命周期的挂钩。在这个钩子中,我正在改变新路线的页面标题。

@CanActivate((next, prev) => { 
   document.title = "mysite | xyz" 
   return true; 
})

然后我为这个组件实现OnInit并调用方法" ngOnInit()"。在这个方法中,我正在调用服务器给我一些数据。此数据存储在名为xyzData的变量中,该变量绑定到模板。我的模板是:

<div class="xyzComp">
 <p>{{xyzData.msg}}</p>
</div>

OnInit是:

ngOnInit(){
    console.log("xyz component init");
    this._myRestfulService.getXyz()
        .subscribe(data => {
            console.log("success",data);
            this.xyzData = data;
        }, err => {
            this.xyzData = {msg:"cannot get data"};
            console.log("error", err);
        });
}

通过点击名为xyzBtn的按钮调用_route.navigate([&#34; XYZ&#34;])来更改路径,该按钮存在于我的应用程序的标题中。所有路线的标题都是常量。

问题是,当我第一次点击xyzBtn时,它只调用在XYZComponent的@CanActivate装饰器中编写的任何内容。下次单击xyzBtn时,@ CanActivate不会被调用,但这次调用了ngOnInit()。

请帮我解决这个问题。仅当我在服务器上部署代码时才会出现此问题。部署服务器是NGINX服务器。在nginx服务器上,我们已配置为忽略前端路由。

但是我的代码在开发服务器上运行得非常好,这是一个名为lite-server的npm模块。

更新 - 适用于其他基于npm的服务器,如http-server。

Update2 - Plunker:https://plnkr.co/edit/E4HNXEjaIP7th77UE4dK?p=preview

Update3 - 我在服务器中使用捆绑文件。通过systemjs构建器构建bundle。这可能是一个问题吗?

2 个答案:

答案 0 :(得分:2)

https://github.com/angular/angular/issues/8166

通过删除system-polyfill

解决了该问题

答案 1 :(得分:0)

这个问题没有具体的答案。只是Angular2和SystemJ都处于测试阶段。您不能使用angular2或其相关模块的缩小文件。此外,您无法将系统js模块与非systemJs javascript文件组合在一起。

因此,如果您在项目中说 - nonsys.js,sys1.js和sys2.js文件。您无法捆绑所有这三个并从服务器提供它们。但是你可以将sys1.js和sys2.js组合成sys-all.js,然后从服务器到浏览器提供2个不同的文件。

对不起,伙计们,这不仅仅是Angular2问题,而是系统问题。