【问题标题】:Directive on Dynamically Rendered Input Element in Angular2+Angular 2 中动态渲染输入元素的指令
【发布时间】:2021-02-09 08:56:33
【问题描述】:

我正在尝试在 div 容器内单击按钮时插入 HTML 输入元素。我创建了一个指令并在子输入元素上添加了该指令。每当我点击输入元素时,该元素都应该从 DOM 中删除。

我能够实现这种行为,但是每当我单击一个 HTML 输入元素时,所有 HTML 元素都会从 DOM 中删除,这是不期望的。

那么,如何在指令中获取单个 html 输入元素引用? app.component.html

<div class="btn-container">
  <button (click)="addInputElement()">Add Input</button>
</div>
<div class="box-container">
    <input deleteDir *ngFor="let el of inputEl; let i = index" id={{i}} [value]=el.value>{{el.value}}/>
</div>

app.component.ts

export class AppComponent implements OnInit{
   inputEl = [];
   addInputElement() {
     this.inputEl.push({value: Math.random()});
   }
}

app.directive.ts

constructor(private elementRef: ElementRef, 
            private renderer: Renderer2) { }


@HostListener('click') onClick() {
    this.renderer.removeChild(this.elementRef.nativeElement.parentNode,this.elementRef.nativeElement)
}

【问题讨论】:

  • 您在组件中应用指令的位置?
  • @Obaid 我已经更新了输入 html 标签。指令是 deleteDir

标签: angular angularjs-directive


【解决方案1】:

我重新创建了您的用例,您提供的代码对我来说看起来不错。我为它创建了一个StackBlitz,你可以看看这个。当我点击一个input 元素时,只有我点击的那个会被删除。

更新

我已经从上面更新了我的StackBlitz。现在,如果您按下一个键,输入字段将被一一删除。基本上我所做的就是将索引传递给指令

HTML

<...>
    *ngFor="..."
    delete      <-- directive
    [index]="i" <-- input parameter in directive
</...>
DIRECTIVE

@Input()
index: number;

constructor(private elementRef: ElementRef, private renderer: Renderer2) {}

@HostListener("input")
onInput() {
   this.renderer.removeChild(
    this.elementRef.nativeElement.parentNode,
    this.elementRef.nativeElement.parentNode.querySelector(
      `[id="${this.index}"]`
    )
  );
}

【讨论】:

  • 谢谢!是的,适用于 Input 元素,但对于按键事件,所有子 div 都将从 DOM 中删除。我的意思是,如果我选择特定的 div 并单击删除按钮,那么所有子 div 都会被删除。为什么会这样?
  • 啊,你说的是他们的按键,让我也检查一下。您应该更新您最初的问题,因为按键不是其中的一部分。
  • 我已经通过示例进行了调整,它现在适用于输入字段中正在进行的任何事件
猜你喜欢
  • 2018-03-10
  • 2017-12-18
  • 2018-04-19
  • 2020-10-09
  • 2016-06-10
  • 2018-05-27
  • 2014-12-17
  • 1970-01-01
  • 2020-08-28
相关资源
最近更新 更多