【问题标题】:Angular 2+ - Limit textarea value in columns and rowsAngular 2+ - 限制列和行中的文本区域值
【发布时间】:2019-05-12 11:31:24
【问题描述】:

我目前面临以下问题。我有一个 textarea,我不仅想用默认属性 rowstextarea 来限制 textarea 的大小em>cols,但我也想防止用户输入比这些属性中定义的字符更多的字符。我有一个可行的解决方案,但我对此不太满意。也许您对如何改进解决方案有一些建议

HTML

<textarea rows="2" cols="10" (keyup)="limitTextArea($event)"></textarea>

JS

limitTextArea(evt: KeyboardEvent) {

    let textarea = evt.target as any
    let maxRows: number = textarea.rows;
    let maxColumns: number = textarea.cols;

    let newContent: string = (textarea.value as string)
        .split('\n')
        .filter((val, row) => row < maxRows)
        .map(val => val.slice(0, maxColumns))
        .join('\n');

    textarea.value = newContent;
}

现在这个解决方案有几个问题。

  1. 它被keyup-Event 调用。因此,用户将始终在他或她输入的字符再次消失之前看到它。
  2. 通过设置textarea.value,我有点搞砸了整个 2 路数据绑定原则
  3. 我使用any 作为我真的不喜欢的textarea 的类型。如果我使用 TypeScript,我想使用 Types。

有什么办法解决这个问题吗?

【问题讨论】:

  • 你试过maxlength和stackoverflow.com/questions/5271782/…吗?
  • 不幸的是,maxlength 只是限制了字符的总数。它不关心每行的字符
  • col 指定每行的字符数。顺便说一句,你试过上面的链接吗?
  • 就您的any 类型而言,如果您将textarea 键入为let textarea = evt.target as HTMLTextAreaElement,则可以删除string 对textarea 值的转换。
  • 谢谢。那是我正在寻找的类型

标签: javascript angular events 2-way-object-databinding


【解决方案1】:

从逻辑上讲,如果您需要 2 行,每行 10 列,则意味着您总共需要 20 个字符。所以你可以简单地设置maxlength="20"。您可以随时相应地更改值...

在这种情况下,您不需要使用keyup 事件。只需使用maxlength 属性,它会限制从用户那里获取的最大字符数,并且不会允许超过这个值。

看看它在下面运行 -

/* disable textarea resizing */
textarea {
  resize: none;
}
<script src="https://unpkg.com/@angular/platform-browser-dynamic@7.0.1/bundles/platform-browser-dynamic.umd.js"></script>
<textarea rows="2" cols="10" maxlength="20"></textarea>

【讨论】:

  • 谢谢。但那是我最初尝试的jsfiddle.net/p9q8jhxf 不幸的是它似乎不起作用。还是我错过了什么:/
  • 你的小提琴现在在这里工作得很好-jsfiddle.net/p9q8jhxf/1,你只是在你的小提琴中添加了角度环境。我刚刚更新了一个 - unpkg.com/@angular/platform-browser-dynamic@7.0.1/bundles/…
  • 很遗憾没有。它需要最大长度。但是行和列被忽略了。我会继续努力的
  • 很奇怪。如果我运行代码 sn-p 它在我的浏览器中也不起作用。我可以在第一行输入 20 个字符(在 chrome 和 ie 中试过)
  • 请让我澄清一下您正在运行 Angular 2+
猜你喜欢
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 2019-05-30
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多