一旦ngIf完成呈现html元素,如何在ngIf中触发指令?

亚历杭德罗·塞拉诺(Alejandro Serrano)

我的问题涉及到* ngif指令,当一次* ngif = true时,我希望先显示html内容,然后再执行'ModClass'指令。

我尝试实现ngOnInit和ngViewInit,但是没有运气,因为我相信ngOnInit在呈现ngif内容时或在生成父组件时更早触发。

另外,对于ngViewInit,我认为我需要订阅某些内容,但我不知道我需要订阅什么。(对此我可能完全错了,它将进行更多研究)

以下代码说明了我的问题以及具有stacksblitz链接的情况,因此您无需在计算机上重新创建此代码即可进行故障排除。

代码要做的是单击按钮,它切换了一个与ngIf一起使用的布尔变量:* ngIf ='trigger'

ngIf代码将显示带有默认CSS类'red'的div块,但是我的指令会将其更改为'blue'类。

更新

事实证明,只要我使用ElementRef,ngViewInit都可以正常工作。感谢您的所有帮助。

src / app / modify-class / modify-class.directive中的指令

import { Directive, OnInit } from '@angular/core'

@Directive({
  selector: 'ModClass'
})
export class ModifyClassDirective implements OnInit {

  constructor (private htmlElement: HTMLElement) {}

  //should i try ngViewinit instead
  ngOnInit () {
    this.activateThisClass()
  }

  /*ngViewInit () {
    this.activateThisClass()
  }*/
  //this function should execute once ng-if condition is true and html is rendered
  activateThisClass () {
    console.log('i\'ve been triggered')
    const list = this.htmlElement.getElementsByClassName('red')
    list.forEach(element => element.classList.remove('red'))
    list.forEach(element => element.classList.add('blue'))
  }
}

src / app / hello.component中的HTML / Hello组件内容

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

@Component({
  selector: 'hello',
  template: `
<h1>Hello {{name}}!</h1>
  <button ModClass='' (click)="trigger=!trigger;"> click me </button>

<div *ngIf='trigger'> 

  <!-- This is what i want to change once it is rendered -->
  <div ModClass='' class='red'> this will/should be overwritten and turn blue </div>

</div>`,
  styles: [`h1 { font-family: Lato; }`]
})
export class HelloComponent  {
  @Input() name: string;
  @Input() trigger: boolean;

  constructor() {this.trigger = false}
}

链接到Stackblitz链接

康纳斯·范

我不知道您是否打算按照问题中所述使用指令(因为red该类似乎仅在元素不存在时才应用),但是您可以更改以下两点以使其起作用:

  • 将指令选择器更改ModClass[ModClass]
  • 注入ElementRef指令构造函数而不是HTMLElement

这是修改后的代码:

import { Directive, ElementRef, OnInit } from '@angular/core'

@Directive({
  selector: '[ModClass]'
})
export class ModifyClassDirective implements OnInit {

  constructor (private elementRef: ElementRef) {}

  ngOnInit () {
    this.activateThisClass()
  }

  activateThisClass () {
    console.log("activateThisClass triggered!")
    const element = this.elementRef.nativeElement;
    element.classList.remove('red');
    element.classList.add('blue');
  }
}

请参阅修改后的stackblitz

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在使用Ajax动态创建的元素上触发指令?

一旦滚动在ios swift中结束,如何在选择的中心单元格处触发didSelectItemAtIndexPath?

追加元素后如何触发指令事件?

jquery:访问角度 *ngIf 指令中的元素

Angular如何在同一HTML元素上使用* ngIf和* ngFor

一旦功能组件中的状态发生变化,如何触发钩子?

一旦删除元素,如何从元素中删除“可拖动”属性?

一旦触发,javascript中的函数不起作用?

一旦网络在 RxSwift 中关闭,再次触发 api

如何在Angularjs指令中呈现html?

一旦光标离开目标元素,如何在javascript中跟踪鼠标移动事件?

一旦找到字典(包含在列表中)中的元素,如何停止列表中的 for 循环

一旦数组中的最后一个元素满足条件,如何使循环结束?

从输入控件导航时如何触发* ngIf指令进行验证

为什么在同一 HTML 元素中使用 Angular 结构指令 *ngIf 与 [hidden] DOM 属性冲突?

一旦完成一组给定的扇出任务,如何在GAE上执行单个聚合任务

React / Redux-一旦上一个动作完成就触发动作

一旦先前的并行步骤之一成功完成,触发阶段运行

一旦许多元素之一发生变化,如何在 JS 中捕获“on change”事件?

循环覆盖数组一旦完成

一旦单击,如何在javascript函数中获取onclick按钮的标题?

一旦不再可见,如何在 ViewPager2 中重置 ViewHolder 的视图状态?

等待元素在Angular 5中的* ngIf之后呈现?

如何使用Angular ngIf指令显示或隐藏元素?

角度:ngif动画跳!从DOM中删除前一个元素后,如何为ngif元素设置动画?

如何在xml的输出中分配到分支的链接,以便一旦我在html的输出中单击它就可以打开它

在指令中动态添加* ngIf

ngIf指令中的Observable <string []>

ngIf指令中的异步管道