大家好,我带着很多想法来找你们,我想谈谈一些我无法得到的东西。
简单的服务研究
所以我们这里有一个由组件触发的服务。
这是一个简单的服务,它在触发时提交可观察的元素:
return this.subject.asObservable();
然后我们有一个组件得到这个:
this.alertService.getMessage().subscribe(message => { this.message = message; });
好吧,到目前为止一切都还好。
这个逻辑被包含到一个组件中,他的选择器名称是 <alert></alert>
嵌套组件
这里我们有另一个组件 <alert></alert>
.
<div class="article-page-container">
<alert></alert>
<ul *ngIf="!alert" class="page-nav-container">
<li *ngFor="let page of pageArray" (click)="pageHandlerEvent(page)" [ngClass]="{ 'page-active': page == pageActive}">{{ page }}</li>
</ul>
</div>
你收到了吗?我想做的是,当嵌套组件收到警报时,它应该关闭页面导航类。
我找到了一个解决方案,这不是如何使其发挥作用的问题,而是找到正确的解决方案,做出一些人们会感到自豪的东西?
ngDoCheck
还需要我多说吗?这很难看,我收到了 1000000000 张无用的支票,但它会起作用。
ngDoChanges
只有当我的组件内部的某些东西实际上发生“变化”时才会发生,对吧?
所以我尝试了这个:
<div class="article-page-container">
<alert (alertOn)="toggleNav($event)"></alert>
<ul *ngIf="!alert" class="page-nav-container">
<li *ngFor="let page of pageArray" (click)="pageHandlerEvent(page)" [ngClass]="{ 'page-active': page == pageActive}">{{ page }}</li>
</ul>
</div>
每次触发警报时,我都会执行一个简单的 this.alertOn.emit(true)
,
但是 ngOnChanges 根本不起作用。这将导致:
core.umd.js:3493 ORIGINAL EXCEPTION: Expression has changed after it was checked. Previous value: 'true'. Current value: 'false'.
其他测试
我尝试将此服务直接包含到容器中(相同 问题)
我已使用带有
的输入将警报移出组件 ngOnChanges 工作(另一个解决方案,但看起来我正在避免更多 我的问题不仅仅是寻找解决方案)
我知道你们都很棒,所以如果您知道应该以“正确的方式”做什么。
祝你有美好的一天!
最佳答案
您是否尝试过移动
this.alertService.getMessage().subscribe(message => { this.message = message; });
订阅您的父容器,然后通过以下方式发送消息作为输入
<alert [message]=message></alert>
这样,您还可以在订阅函数中包含一些逻辑来更改页面导航容器的显示标志 bool 值
关于javascript - Angular 2、ngOnChanges、ngDoCheck,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41800316/