我正在使用使用ionic3和angular的自动调整大小的多文本区域,但是它仅适用于单个文本区域。我可以获取解决此问题的指南吗?下面是我的代码

home.html

<ion-list [formGroup]="editForm">
 <ion-item>
  <ion-label floating class="label">Description1</ion-label>
  <ion-textarea autosize formControlName="desc"></ion-textarea>
 </ion-item>
<ion-item>
  <ion-label floating class="label">Description2</ion-label>
  <ion-textarea autosize formControlName="desce"></ion-textarea>
 </ion-item>
</ion-list>


Home.ts

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

@IonicPage()

@Component({
selector: 'page-home',
templateUrl: 'home.html',
 })
  @Directive({
  selector: 'ion-textarea[autosize]'
  })
 export class Home implements OnInit {
 @HostListener('input', ['$event.target'])
  onInput(textArea: HTMLTextAreaElement): void {
    this.adjust();
}
 constructor(public element: ElementRef,){}
 ngOnInit(): void {
    setTimeout(() => this.adjust(), 0);
}

adjust(): void {
    let textArea =
    this.element.nativeElement.getElementsByTagName('textarea')[0];
    textArea.style.overflow = 'hidden';
    textArea.style.height = 'auto';
    textArea.style.height = textArea.scrollHeight + "px";
 }
}

最佳答案

它仅适用于单个文本区域,因为您告诉它只能在数组的第一个文本区域上运行

let textArea = this.element.nativeElement.getElementsByTagName('textarea')[0];


getElementsByTagName返回屏幕上所有文本区域的数组。因此,您应该尝试遍历这些。类似于:

const textAreas = this.element.nativeElement.getElementsByTagName('textarea');
textAreas.forEach(textArea => {
    textArea.style.overflow = 'hidden';
    textArea.style.height = 'auto';
    textArea.style.height = textArea.scrollHeight + "px";
});


作为附带说明,您将来可能希望研究使用ViewChild / ViewChildren。这是直接以角度操作/访问dom元素的正确方法,应尽可能使用

I spun up a quick example using ViewChildren here
ViewChildren和另一个stackoverflow post使用角度文档

09-11 06:51