我有一个角度组件,允许用户将数据输入textarea
。有两个事件与此keydown
和paste
相关联。这两个事件都会触发相同的方法来尝试确定输入的数据。
我遇到的问题是,在粘贴数据paste
时,我得到了formControl
的值,但是在粘贴数据之前它的值是什么,并不包含我的内容实际上刚刚进入了这个领域。
HTML
<textarea
formControlName="multiSearch"
class="form-control"
placeholder="Enter one or more values. One per line."
rows="6"
(keydown)="keyDownFunction($event)"
(paste)="onPaste()">
</textarea>
组件
/**
* If we hit enter in our text area, determine the data type
*/
keyDownFunction(event) {
// Enter Key?
if (event.keyCode == 13) {
this.determineDataType();
}
}
/**
* If we paste data in our text area, determine the data type
*/
onPaste() {
this.determineDataType();
}
/**
* Using regex, determine the datatype of the data and confirm with the user.
*/
determineDataType() {
console.log(this.searchForm.value.multiSearch)
}
问题
如何在paste
事件被触发后立即访问粘贴到表单中的数据,而不是粘贴之前的值?
答案 0 :(得分:10)
您可以通过处理paste
事件来获取textarea
事件中粘贴的内容以及input
的更新内容:
<textarea #myText (paste)="onPaste($event)" (input)="onInput(myText.value)"></textarea>
使用此代码:
onPaste(event: ClipboardEvent) {
let clipboardData = event.clipboardData || window.clipboardData;
let pastedText = clipboardData.getData('text');
...
}
onInput(content: string) {
...
}
请参阅this stackblitz了解演示。
答案 1 :(得分:0)
这来自适用于我的项目的angular2打字稿示例。希望它可以帮助某人。其他情况的逻辑也一样。
<textarea placeholder="Type a message" (paste)="onPaste($event)"></textarea>
<!-- Place to render the image -->
<img #imgRenderer />
// Reference to the dom element
@ViewChild('imgRenderer') imgRenderer: ElementRef;
onPaste(event: any) {
const items = (event.clipboardData || event.originalEvent.clipboardData).items;
let blob = null;
for (const item of items) {
if (item.type.indexOf('image') === 0) {
blob = item.getAsFile();
}
}
// load image if there is a pasted image
if (blob !== null) {
const reader = new FileReader();
reader.onload = (evt: any) => {
console.log(evt.target.result); // data url!
this.imgRenderer.nativeElement.src = evt.target.result;
};
reader.readAsDataURL(blob);
}
}