期望的行为:
所以,我有一个菜单元素的组件.当(在另一个组件中)我点击一个IBO(某种’客户’,每说)被点击我需要添加(我使用* ngIf)菜单中的新选项,即IBO详细信息和子列表.
IBOsNavigationElement组件(菜单组件):
@Component({ selector: '[ibos-navigation-element]',template: ` <a href="#"><i class="fa fa-lg fa-fw fa-group"></i> <span class="menu-item-parent">{{'IBOs' | i18n}}</span> </a> <ul> <li routerLinkActive="active"> <a routerLink="/ibos/IBOsMain">{{'IBOs Main' | i18n}} {{id}}</a> </li> <li *ngIf="navigationList?.length > 0"> <a href="#">{{'IBO Details' | i18n}}</a> <ul> <li routerLinkActive="active" *ngFor="let navigatedIBO of navigationList"> <a href="#/ibos/IboDetails/{{navigatedIBO['id']}}">{{navigatedIBO['name']}}</a> </li> </ul> </li> </ul> ` }) export class IBOsNavigationElement implements OnInit { private navigationList = <any>[]; constructor(private navigationService: NavigationElementsService) { this.navigationService.updateIBOsNavigation$.subscribe((navigationData) => { this.navigationList.push(navigationData); log.d('I received this Navigation Data:',JSON.stringify(this.navigationList)); } ); } ngOnInit() { } }
最初,navigationList将为空[],因为用户没有单击任何IBO(客户端),但只要单击IBO,就会填充列表,因此,我需要在菜单中显示新选项.
使用此代码,当我点击IBO时,< li>元素和它的子项被创建但是:我只看到< li>元件.
问题:
菜单选项已生成,但未由布局样式进行处理.需要使用所有元素对其进行初始化,以便了解如何显示菜单选项.
注意:
如果我使用没有* ngIf的模板,效果很好,但我会从第一时间开始有一个没有意义的IBO详细信息选项,因为初始化时没有点击过IBO.
template: ` <a href="#"><i class="fa fa-lg fa-fw fa-group"></i> <span class="menu-item-parent">{{'IBOs' | i18n}}</span> </a> <ul> <li routerLinkActive="active"> <a routerLink="/ibos/IBOsMain">{{'IBOs Main' | i18n}} {{id}}</a> </li> <li> <a href="#">{{'IBO Details' | i18n}}</a> <ul> <li routerLinkActive="active" *ngFor="let navigatedIBO of navigationList"> <a href="#/ibos/IboDetails/{{navigatedIBO['id']}}">{{navigatedIBO['name']}}</a> </li> </ul> </li> </ul> `
期望的输出:
在点击任何内容之前(在init上):
点击IBO(客户端)后:
更新1:
澄清我的意思:
The menu option is generated but not proccessed by the layout styles
如果,我的菜单组件初始化没有* ngIf:
<li> <a href="#">{{'IBO Details' | i18n}}</a> <ul> <li routerLinkActive="active" *ngFor="let navigatedIBO of navigationList"> <a href="#/ibos/IboDetails/{{navigatedIBO['id']}}">{{navigatedIBO['name']}}</a> </li> </ul> </li>
<li> <a> <ul> <li *ngFor> <a> </li> </ul> </li>
但是,如果它在没有所有元素的情况下进行初始化(当* ngIf为false时,< li>并且它的子节点未呈现,因此布局不会将它们考虑在内以绘制/创建菜单)并且这些元素在渲染后添加,然后它们将存在于源代码中,但我们将无法在菜单中看到它们,因为:
>没有创建
>没有子菜单行为
解决方法
>默认策略,自动检测模型中的更改并相应地重新呈现组件.
> OnPush,仅在您明确告诉它时才重新呈现该组件
所以.
另见https://angular.io/docs/ts/latest/api/core/index/ChangeDetectionStrategy-enum.html
当您在页面上有多个元素或希望对渲染过程有更多控制权时,OnPush策略可以获得更好的性能.
要使用此策略,您必须在组件中声明它:
@Component({ selector: '[ibos-navigation-element]',template: `...`,changeDetection: ChangeDetectionStrategy.OnPush })
并注入您的构造函数:
constructor( private changeDetector: ChangeDetectorRef,) {}
当您要触发更改检测时,可以重新呈现组件
(在您的情况下,在将新的IBO /客户端添加到模型之后),请致电:
this.changeDetector.markForCheck();
查看官方教程:http://plnkr.co/edit/GC512b?p=preview中的现场演示
如果问题不是关于变化检测,而是与CSS / SCSS样式有关,请记住,在Angular 2中,每个组件都有自己的CSS类和它们不是由“儿童”元素“继承”的.他们是完全孤立的彼此.一种解决方案可能是创建全局CSS / SCSS样式.