当前位置: 首页 > 知识库问答 >
问题:

如何仅在组件的标签为`*ngIf=true '时初始化组件?

刘海
2023-03-14

更新:
君特·佐赫鲍尔提供了一个非常可以接受的答案,效果很好(谢谢!但我仍然有一个问题要检查我正在做的事情是否是获得我所寻求的结果的正确方法。背景如下。
我对父视图上的自定义标记的期望是,当 *ngIf 条件为 false 时,根本不加载组件(或者可能是大部分)。即使它不在 DOM 中(因为条件为 false),它仍然被加载是正常的吗?有没有更好的方法将组件的模板(及其类的逻辑)嵌入到父组件的模板中?

我是Angular 2的新手,到目前为止,我非常喜欢开发基于Spotify API的小型歌曲轨道元数据应用程序。

TL;DR:如何仅在组件对应的HTML标签(用< code>@Component的< code>selector属性定义)if *ngIf="true"时初始化组件?

但是我当然面临困难!我有这个组件,TrackDetailComponent,我想在模板中包含另外两个组件。单击按钮时,它会从一个内部组件切换到另一个。
以下是模板的样子(请注意,我现在只开发了两个内部组件中的一个,所以我使用占位符代替了第二个):

<div id="view">
    <tig-track-info *ngIf="childView == TrackDetailView.InfoView" [track]="track"></tig-track-info>
    <p *ngIf="childView == TrackDetailView.LyricsView">Here go the lyrics</p>
</div>

如您所见,我的内部组件(名为< code>TrackInfoComponent)有一个输入参数。以下是该组件的摘录:

@Component({
    selector: "tig-track-info",
    templateUrl: "app/components/track-info/track-info.component.html",
    styleUrls: ["app/components/track-info/track-info.component.css",
                "app/shared/animations.css"]
})
export class TrackInfoComponent implements OnInit {
    private _trackId: string = null;
    @Input() 
    track: Track = null;
    previewAudio: any = null; // The Audio object is not yet defined in TypeScript
    albumArtworkLoaded: boolean = false;
    ...
}

我真正的问题不是将TrackInfoComponent嵌入到另一个中,而是同步它们。TrackDetailComponent异步调用API,然后初始化track属性。但是TrackInfoComponent还需要初始化跟踪才能完成其工作,否则我会得到一个空引用异常(这是合乎逻辑的)。

我尝试在ngOnInit()中设置子组件数据,并仅在跟踪就绪时将其父模板的*ngIf设置为true,但似乎立即调用了ngOnIni(),即使DOM元素tig跟踪信息未与*ngIf一起显示。

我想我可以在子组件中使用事件或我自己的init方法,只在我准备好时调用,但我想知道是否有更好的方法可以使用Angular 2组件生命周期挂钩或任何其他推荐的方法来实现这一点。有人知道吗?

谢谢:-)

共有2个答案

汤飞羽
2023-03-14

1)第一步

import { Component, OnInit, ChangeDetectorRef } from '@angular/core';

代码中添加ChangeDetectorRef

2)第二步

constructor(private changeDetector : ChangeDetectorRef){
}

3)每当你的*ngIF="条件"发生变化时,即条件变为真,那么你可以调用

  if(true==condition){
     this.changeDetector.detectChanges();
  }

4)这将呈现您的html模板。

你可以试试这个,如果它适合你。

祁星阑
2023-03-14

您可以使用OnChanges,每当模板绑定`[track]=“…”更改@Input()属性值时,就会调用OnChanges

  export class TrackInfoComponent implements OnChanges {
    ngOnChanges(changes: SimpleChanges) {
      if(this.track) {
        ...
      }
    }
  }
 类似资料:
  • 问题内容: 我正在初始化这样的数组: NetBeans在此行指出一个错误: 我该如何解决这个问题? 问题答案: 上面的信息不正确(语法错误)。这意味着你正在分配一个仅可容纳元素的数组。 如果要初始化数组,请尝试使用: 注意两个声明之间的区别。将新数组分配给声明的变量时,new必须使用。 即使你纠正了语法,访问仍然是不正确的(你只能访问,因为Java中的数组索引是基于0的)。访问]将抛出。

  • 第一行代码是什么意思?它如何调整数组大小?第二行代码如何初始化该字节数组(如果是)?

  • 问题内容: 在React中,这两种实现之间有什么真正的区别?一些朋友告诉我,FirstComponent是模式,但是我不明白为什么。SecondComponent看起来更简单,因为渲染仅被调用一次。 第一: 第二: 更新:我将setState()更改为this.state = {}(感谢joews),但是,我仍然看不到区别。一个比另一个好吗? 问题答案: 应该注意的是,复制永远不会更改为状态的属性

  • 问题内容: 我只是看了这个SO Post: 但是,哥伦比亚大学教授的笔记按以下方式进行。请参阅第9页。 哪种方法正确?他们似乎在说不同的话。 特别是在注释版本中没有。 问题答案: 这根本不会在Java中编译(因为您正在将数组类型的值分配给非数组类型的变量): 被以下错误拒绝(另请参见:http : //ideone.com/0jh9YE): 要进行编译,请声明其类型,然后在其上循环:

  • 我看了这个,这个,还有这个,但遗憾的是,没有一个能解决我的问题。组件总是空的。ID是一样的,但我仍然不知道我做错了什么。下面是我的代码: 应用类。 RootView.fxml 控制器类 应用程序运行正常。我错过了什么吗?

  • 本文向大家介绍如何在Java 9的JShell中初始化数组?,包括了如何在Java 9的JShell中初始化数组?的使用技巧和注意事项,需要的朋友参考一下 Java中的数组 也是一个对象。我们需要声明一个数组然后创建。为了声明一个包含整数数组的变量,我们可以像int [] array一样提到。在数组中,索引 从0到(数组的长度-1)开始。 片段1 在下面的代码片段中,我们可以创建一个标记数组来存储

  • 问题内容: 该方法的Java文档 在返回说明中包括以下内容: 如果目录为空或过滤器未接受任何名称,则该数组为空。 我如何做类似的事情,并将String数组(或与此相关的任何其他数组)初始化为长度为0? 问题答案: 正如其他人所说, 确实会创建一个空数组。但是,关于数组有一件好事-数组的大小无法更改,因此您始终可以使用相同的空数组引用。因此,在您的代码中,您可以使用: 然后每次需要时就返回-无需每次

  • 问题内容: 我开始使用python,并尝试使用一个二维列表,最初我在每个地方都填充了相同的变量。我想出了这个: 它提供了所需的结果,但感觉像是一种解决方法。有没有更简单/更短/更优雅的方式来做到这一点? 问题答案: Python中经常出现的一种模式是 这有助于激励列表理解的引入,从而将代码段转换为 它更短,有时更清晰。通常,你养成识别这些习惯的习惯,并经常用理解代替循环。 你的代码两次遵循此模式