Angular 2路由订阅变化检测

标签 angular routes angular2-observables angular2-changedetection

鉴于此代码:

ngOnInit() {
    this.apiService.getBlogPosts().subscribe(blogPosts => {
        this.allBlogPosts = blogPosts;

        this.changeDetector.detectChanges();
    }));
}

我试图理解为什么我被迫使用 this.changeDetector.detectChanges();

情况是,如果我第一次加载我的博客路由,如果我路由到另一个页面(另一个组件或相同的组件),我的帖子加载得很好。 “blog”组件来显示特定帖子的详细信息(例如“blog/my-post”)),然后我路由回到根目录的“blog”组件('blog/'),这一次,模板无法更新帖子。我可以在我的 InspectNetwork 选项卡中看到获取帖子的路由仍然有效,console.log 显示一切似乎很好,但是除非我强制进行更改检测,否则模板无法更新。这是预期的行为吗?可以补救吗?这看起来很奇怪...

另一件值得注意的事情是,我第一次和第三次访问我使用的“博客”组件:

this.router.navigate([`/${url}`]);

要导航到它...这也是没办法的...

编辑: getBlogPosts() 方法位于我的 ApiService 中,我将其注入(inject)到我的 BlogComponent 中:

public getBlogPosts() : Observable<BlogPost[]> {
    return this.http.get(`${ environment.apiUrl }GetBlogPosts`, { headers: this.headers })
                    .map((response: Response) => <BlogPost[]>response.json());
}

最佳答案

Angular 使用 NgZone 在应该运行更改检测周期时收到通知。 NgZone 在底层使用 zone.js 来拦截所有异步操作,例如 setTimeoutnew Promise XHR 请求等。因此通常无需开发人员进行任何额外的努力即可工作。

但是,如果您的某些操作未被 zone.js 捕获,您将不会触发更改检测,并且必须手动执行此操作。但是您可以使用 NgZone 在 Angular 区域中执行某些操作,这意味着 Angular 将在回调执行完成后运行更改检测。

所以根据你的情况,你可以尝试这样的事情:

this.routerSubject.subscribe((url: string) => { NgZone.run(() => this.router.navigate([/${url}]); });

其中 NgZone 可以注入(inject)到任何 Angular 组件或服务中:

constructor(zone: NgZone) {}

关于Angular 2路由订阅变化检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45730819/

相关文章:

asp.net-mvc-4 - ASP.NET MVC 4 路由不工作

angular - 订阅一个主题,第一次在 init 上不起作用

javascript - 如何将数组从 observable 映射到另一个数组

angularjs - Laravel 5 API 路由向前端返回 500 错误

Angular 2 Http 提供者的可观察订阅未触发

javascript - Angular 2从url获取json数据

javascript - 如何从使用 ngFor 指令动态添加的 HTML 表中恢复标题单元格数据

Angular 2缓存可观察的http结果数据

javascript - 在 Angular 2 App 中使用 *ngIf 在负面情况下未获得预期结果

routes - 在 Flask 中阻止特定路由上的引荐来源网址