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

我应该如何在Angular 8中使用@ViewChild的新静态选项?

段成益
2023-03-14

我应该如何配置新的角度8视图子?

@ViewChild('searchText', {read: ElementRef, static: false})
public searchTextInput: ElementRef;

VS

@ViewChild('searchText', {read: ElementRef, static: true})
public searchTextInput: ElementRef;

哪一个好些?什么时候应该使用静态:true静态:false

共有1个答案

狄元魁
2023-03-14

在大多数情况下,您将希望使用{static:false}。这样设置它将确保找到依赖于绑定解析的查询匹配(如结构指令*NGIF等..)。

何时使用statice:false的示例:

@Component({
  template: `
    <div *ngIf="showMe" #viewMe>Am I here?</div>
    <button (click)="showMe = !showMe"></button>
  ` 
})
export class ExampleComponent {
  @ViewChild('viewMe', { static: false })
  viewMe?: ElementRef<HTMLElement>; 

  showMe = false;
}

static:false将是Angular 9中的默认回退行为。在这里和这里阅读更多内容

引入{static:true}选项是为了支持即时创建嵌入式视图。当您动态创建视图并希望访问TemplateRef时,您将无法在NGAfterViewInit中这样做,因为这将导致ExpressionHasChangedAfterChecked错误。将静态标志设置为true将在ngoninit中创建视图。

尽管如此:

在大多数其他情况下,最佳实践是使用{static:false}

但是请注意,{static:false}选项将在Angular 9中成为默认值。这意味着不再需要设置static标志,除非您希望使用statice:true选项。

您可以使用angular cling update命令自动升级当前的代码库。

有关迁移指南和更多信息,您可以查看这里和这里

#静态查询和动态查询有什么区别?@viewChild()和@contentChild()查询的静态选项确定查询结果何时可用。

对于静态查询(static:true),查询在视图创建后解析,但在更改检测运行之前解析。但是,结果永远不会更新以反映对视图的更改,例如对ngIf和ngFor块的更改。

对于动态查询(静态:false),查询分别在@ViewChild()和@ContentChild()的ngAfterViewInit()或ngAfterContentInit()之后解析。对于您的视图的更改,如对ngIf和ngFor块的更改,将更新结果。

使用statice:true的一个好用例是使用fromevent绑定到模板中定义的元素。请考虑以下模板:

<div [ngStyle]="thumbStyle$ | async" #thumb></div>

然后,您可以处理该元素上的事件,而不需要使用订阅或init挂钩(如果您不想或不能使用角度事件绑定):

@Component({})
export class ThumbComponent {
  @ViewChild('thumb', { static: true })
  thumb?: ElementRef<HTMLElement>;

  readonly thumbStyle$ = defer(() => fromEvent(this.thumb, 'pointerdown').pipe(
    switchMap((startEvent) => fromEvent(document, 'pointermove', { passive: true })
    // transform to proper positioning
  ));
}

使用defer是很重要的。这将确保observable仅在订阅时才解析。这将发生在NGAfterViewInit被触发之前,当Async管道订阅它时。因为我们使用的是statice:true,所以已经填充了this.thumb

 类似资料:
  • 问题内容: 将所有导入内容转换为多重要?为什么人们仍然不愿意使用? 问题答案: 如文档所述,请谨慎使用。寻找那里的理由。

  • 问题内容: 我不太清楚当我这样说时会做什么: 我可以稍微了解使用它的原因,因为它不浏览整个数据库表以更新字段,而是仅更新新添加的记录。如我错了请纠正我。 所以我想做的是使用这样创建索引: 一旦执行此操作,文档就根本不会上传到索引。我要去哪里错了? 任何帮助,不胜感激。 问题答案: 如果您的表中有一个时间戳列(例如),则最好使用它代替ID号。这样,当记录更新时,您也可以修改该时间戳,输入插件将提取记

  • 问题内容: 在Objective- C中,我调用该方法来记录异常。如何在Swift中调用它? 问题答案: 使用Swift 2,您可以将Swift函数和闭包作为C函数指针传递 原始答案 从Xcode 6 beta 6开始,您不能这样做。 Swift确实支持传递函数指针,但是它们几乎就像不透明指针一样被对待。您既不能定义指向Swift函数的C函数指针,也不能在Swift中调用C函数指针。 这意味着您从

  • 问题内容: 这个问题在很多地方都被问到,变化不尽。例如Java-getClassLoader()。getResource()不仅使我烦恼不已。)我仍然无法使其正常工作。 这是一个代码片段: 此作品-请注意,我硬编码的路径,包含剪辑文件,该文件的目录 是 有,而且 是 在同一目录作为我的.class文件。las,注释掉的代码仅返回url的空值。 其他大多数帖子似乎都涉及getResourceAsSt

  • 问题内容: 我正在解决这个问题,有没有一种方法可以覆盖Java中的类变量? 第36条反对意见是: 如果您看到,请运行。 谁能解释为什么皱眉呢? 问题答案: 这是一个风格上的问题,而不是直接的问题。这表明您没有正确考虑班上正在发生的事情。 考虑一下什么意思: 此变量存在于类级别,在每个实例 中并不单独存在,并且在扩展me的类中没有独立存在 。 考虑一下什么意思: 该变量可以在此类,同一包中的 类以及

  • 问题内容: 我使用RedisConnection Set方法设置字节数组,但是如何获取数据?get返回包装的字节数组吗? 链接: http://code.google.com/p/booksleeve/ http://code.google.com/p/protobuf-net/ 这可行,但感觉不对: 更多信息: 问题答案: 那是完全正确的。“ Get”(BookSleeve)返回一个deferr