无法获取离子4中离子文本区域的nativeElement来设置高度

时间:2019-01-13 23:02:21

标签: angular-directive ionic4 elementref

我有一个自定义指令,可在输入文本时调整离子文本区域的高度以自动调整高度,而不是设置固定的行高或在文本区域填满时设置难看的滚动条。

在Ionic-4中,我无法获得ion-textarea的html textarea的nativeElement。任何帮助都很好

它在Angular 6和Ionic 4上运行,但是当我尝试获取this.element.nativeElement.getElementsByTagName('textarea')[0]时,它始终是未定义的,因此无法以编程方式设置高度。

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

@Directive({
  selector: 'ion-textarea[autosize]'
})

export class AutosizeDirective implements OnInit {
  @HostListener('input', ['$event.target'])
  onInput(textArea:HTMLTextAreaElement):void {
    this.adjust();
  }

  constructor(public element:ElementRef) {
  }

  ngOnInit():void {
    setTimeout(() => this.adjust(), 0);
  }

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

由于const textArea总是返回未定义状态,因此我无法将高度设置为跟随滚动高度以防止滚动条。

有人能在Ionic-4中做到这一点吗?在上面的代码中看到了Ionic-3中的工作示例。

谢谢 罗维

2 个答案:

答案 0 :(得分:2)

下面的代码将帮助您解决问题。

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

@Directive({
  selector: 'ion-textarea[autosize]'
})

export class AutoSizeDirective implements AfterViewInit {
  readonly defaultHeight = 64;

  @HostListener('input', ['$event.target'])
  onInput(textArea: HTMLTextAreaElement) {
    this.adjust(textArea);
  }

  constructor(private element: ElementRef) {}

  ngAfterViewInit() {
    this.adjust();
  }

  adjust(textArea?: HTMLTextAreaElement) {
    textArea = textArea || this.element.nativeElement.querySelector('textarea');

    if (!textArea) {
      return;
    }

    textArea.style.overflow = 'hidden';
    textArea.style.height = 'auto';
    textArea.style.height = (textArea.value ? textArea.scrollHeight : defaultHeight) + 'px';
  }
}
  

用法:<ion-textarea autosize></ion-textarea>

我已经在Ionic 4.0.2/Angular 7.2.6上确认了。

致谢。

答案 1 :(得分:1)

此软件包为我完成了所有离子文本区域的自动调整https://github.com/chrum/ngx-autosize 只需按照指南进行操作即可,如果无法正常工作,则将其导入到app.module.ts中,然后尝试将其导入到页面的模块中,如果您愿意,我个人需要使用dunno,但包可以节省生命。