加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Angular2:渲染/重新加载组件的模板

发布时间:2020-12-17 17:42:57 所属栏目:安全 来源:网络整理
导读:理想情况下,我需要重新加载/重新呈现组件的模板,但如果有更好的方法,我会很乐意实现它. 期望的行为: 所以,我有一个菜单元素的组件.当(在另一个组件中)我点击一个IBO(某种’客户’,每说)被点击我需要添加(我使用* ngIf)菜单中的新选项,即IBO详细信息和子列表
理想情况下,我需要重新加载/重新呈现组件的模板,但如果有更好的方法,我会很乐意实现它.

期望的行为:

所以,我有一个菜单元素的组件.当(在另一个组件中)我点击一个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上):

enter image description here

点击IBO(客户端)后:

enter image description here

更新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>并且它的子节点未呈现,因此布局不会将它们考虑在内以绘制/创建菜单)并且这些元素在渲染后添加,然后它们将存在于源代码中,但我们将无法在菜单中看到它们,因为:

>没有创建
>没有子菜单行为

解决方法

Angular有两种变化检测策略:

>默认策略,自动检测模型中的更改并相应地重新呈现组件.
> 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样式.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读