【发布时间】:2019-05-12 11:31:24
【问题描述】:
我目前面临以下问题。我有一个 textarea,我不仅想用默认属性 rows 和 textarea 来限制 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;
}
现在这个解决方案有几个问题。
- 它被
keyup-Event 调用。因此,用户将始终在他或她输入的字符再次消失之前看到它。 - 通过设置
textarea.value,我有点搞砸了整个 2 路数据绑定原则 - 我使用
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