在离子中自动生长textarea

时间:2014-06-29 20:57:54

标签: javascript angularjs textarea ionic-framework

我正在尝试向我的应用添加一个autogrowing textarea,但由于某种原因它无法正常工作。我正在使用的模块是https://github.com/tagged/autogrow(它是在离子论坛上推荐的)

9 个答案:

答案 0 :(得分:14)

上面的答案并没有缩小 - 这是一个改进的版本:

https://codepen.io/benshope/pen/xOPvpm

angular.module('app').directive('expandingTextarea', function () {
    return {
        restrict: 'A',
        controller: function ($scope, $element, $attrs, $timeout) {
            $element.css('min-height', '0');
            $element.css('resize', 'none');
            $element.css('overflow-y', 'hidden');
            setHeight(0);
            $timeout(setHeightToScrollHeight);

            function setHeight(height) {
                $element.css('height', height + 'px');
                $element.css('max-height', height + 'px');
            }

            function setHeightToScrollHeight() {
                setHeight(0);
                var scrollHeight = angular.element($element)[0]
                  .scrollHeight;
                if (scrollHeight !== undefined) {
                    setHeight(scrollHeight);
                }
            }

            $scope.$watch(function () {
                return angular.element($element)[0].value;
            }, setHeightToScrollHeight);
        }
    };
});

这会将你所有的textareas变换为成长/缩小。

希望有所帮助!

答案 1 :(得分:10)

我发现了一种更好的方法,可以在不使用任何其他第三方库或指令的情况下完成此操作。

$scope.updateEditor = function() {
    var element = document.getElementById("page_content");
    element.style.height = element.scrollHeight + "px";
};

然后只需添加ng-keypress =" updateEditor()"到textarea就可以了。

<textarea ng-keypress="updateEditor()" ng-model="bar"> </textarea>

我希望这可以帮助将来可能面临这个问题的其他人。

更新:以下是此代码:http://codepen.io/kpourdeilami/pen/KDepk

更新2:使用@benshope

提供的代码段

更新3:如果您使用的是Ionic / Angular 2,请使用&#34; Max Al Farakh提供的答案&#34;

答案 2 :(得分:10)

我写了一个非常简单的指令,适用于Ionic 2和ion-textarea。这是:

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

@Directive({
selector: "ion-textarea[autoresize]" // Attribute selector
})
export class Autoresize {
  @HostListener("input", ["$event.target"])
  onInput(textArea: HTMLTextAreaElement): void {
    this.adjust();
  }

  constructor(public element: ElementRef) {
  }

  ngOnInit(): void {
    this.adjust();
  }

  adjust(): void {
    let ta = this.element.nativeElement.querySelector("textarea");
    ta.style.overflow = "hidden";
    ta.style.height = "auto";
    ta.style.height = ta.scrollHeight + "px";
  }
}

这是一个要点:https://gist.github.com/maxt3r/2485356e91a1969bdb6cf54902e61165

编辑:看看其他人提出的其他建议的要点。

答案 3 :(得分:9)

尝试Angular-Elastic。它是一个角度指令,用于自动扩展textarea。使用凉亭安装它。

bower install angular-elastic

将其添加到您的项目中,然后您可以将其用作属性

<textarea msd-elastic ng-model="foo"> </textarea>

或作为班级

<textarea class="msd-elastic" ng-model="bar"> </textarea>

答案 4 :(得分:2)

你的意思是垂直自动增长吗?我试过这个:

  <textarea ng-model='doc.description'
   rows='{{doc.description.length/50 + 1}}' 
   cols='50'></textarea>

有点hackish,但在确定了预期的列长度后,让我们根据输入文本的长度定义行长度。当我开始打字时,它开始垂直增长! (没有滚动/退出视图文本)。

答案 5 :(得分:2)

从Ionic 4.4开始,它是内置的,请参见autoGrow属性:

TextArea#Properties

<ion-textarea auto-grow="true" rows="1"></ion-textarea>

答案 6 :(得分:1)

对于ionic-5,有一个称为自动增长的选项,在您的视图中将其设置为true。 在CSS中,设置min-height,max-height以控制文本的增长。

ion-textarea {
min-height: 100px;
max-height: 200px;
}

此外,在完成上述修复后,如果您发现占位符文本有些奇怪的行为,请在ion-textarea的内部添加以下内容

::ng-deep textarea {
min-height: 100px;
}

答案 7 :(得分:0)

如果它可以为某人服务,我改变了一点benshope的解决方案,因为即使用户回车,我也需要textarea增长。

因此,我没有听取输入值的变化(在回车时并不总是触发),而是在textarea上存在input事件。

(function () {
'use strict';

angular
        .module('app')
        .directive('expandingTextarea', expandingTextarea);

function expandingTextarea() {
    return {
        restrict: 'A',
        controller: function ($scope, $element, $attrs, $timeout) {
            $element.css('min-height', '0');
            $element.css('resize', 'none');
            $element.css('overflow-y', 'hidden');
            setHeight(0);
            $timeout(setHeightToScrollHeight);

            function setHeight(height) {
                $element.css('height', height + 'px');
                $element.css('max-height', height + 'px');
            }

            function setHeightToScrollHeight() {
                console.log('set height');
                setHeight(0);
                var scrollHeight = angular.element($element)[0]
                        .scrollHeight;
                if (scrollHeight !== undefined) {
                    setHeight(scrollHeight);
                }
            }

            angular.element($element)[0].addEventListener("input", setHeightToScrollHeight);
        }
    };
}})();

答案 8 :(得分:0)

只需安装:  凉亭安装角弹性或

npm安装角弹性;

然后像这样将index.html文件中的elastic.js文件导入

    <script src="js/elastic.js" type="text/javascript"></script>

之后,将其注入角度模块,如下所示:

angular.module('yourApp', ['monospaced.elastic']);

之后,在html文件中的页脚栏中执行以下操作:

  <ion-footer-bar  style="height: auto;  overflow: visible !important"><textarea rows="1" msd-elastic  ng-model="myMsg">
</textarea>