Observable TextArea defaultValue 是 sendMessage SignalR & Typescript/angular 之后的空格
Observable TextArea defaultValue is whitespace after sendMessage SignalR & Typescript/angular
我正在调整基本的 SignalR 聊天功能。
广泛的上下文:当用户发送消息时,消息被发送,但是空的文本区域(除了占位符)已经被发送,
现在有一个 event.currentTarget.defaultValue,由大约 13 个空格组成的字符串。
我尝试通过将其设置为 null 或 '' 来更正它,但空白仍然存在,隐藏了占位符(偏离路线)。
原始输入字段是一个字符串,在我的版本中,我为其创建了一个 behaviorSubject,并添加了一个该 behaviorsubject 的可观察对象
txtMessage: string = null;
txtSubject: BehaviorSubject<string>;
txtStatus: Observable<string>;
this.txtSubject = new BehaviorSubject<string>(this.txtMessage);
this.txtStatus = this.txtSubject.asObservable();
this.txtStatus.subscribe(status => {
if(status !== null && status.length)
let senderid = this.userid;
let receiverid = this.selectedChatFriend.id;
let message = 'typing:' + senderid + ';receiver' + receiverid;
this.chatService.startedTyping(message);
}
if(status == null && this._selectedChatFriend !== null && this._selectedChatFriend !== undefined){
let senderid = this.userid;
let receiverid = this.selectedChatFriend.id;
let message = 'nottyping:' + senderid + ';receiver' + receiverid;
this.chatService.stoppedTyping(message);
}
});
问题:
当用户发送消息时,接收者会收到通知。
在发送第一条消息时,一切正常。在第一条消息之后,我得到的是空白而不是空文本区域,当这个用户再次开始输入时,isTyping 没有被触发,因为 'starttyping' 上的 ifstatement 没有预料到空白
textinputreceived(event: any){
if (event.currentTarget.value.length > 0 && event.inputType == "insertLineBreak"){
//event.preventDefault();
this.sendTextMessage(event.currentTarget.value);
}
//filter out anything that is not the txtMessage
if(event.currentTarget.value.length == 1 && event.inputType == "insertText"){
//user started typing
//triggers the isTyping
this.txtSubject.next(event.data);
} else if (event.currentTarget.value == '' && event.inputType == "deleteContentBackward"){
//user just deleted the only char in the message
//triggers stopped typing
this.txtSubject.next(null);
}
}
HTML:
<div class="type_msg">
<div class="input_msg_write">
<textarea type="text"
id="chatbx"
placeholder="Type a message"
class="write_msg"
[value]="txtMessage"
(input)="textinputreceived($event)"
(keydown.enter)="sendTextMessage($event)">
</textarea>
<button class="msg_send_btn"
type="button"
(click)="sendTextMessage($event)">
<i class="fa fa-paper-plane-o" aria-hidden="true">
<mat-icon style="color:black;margin-top:10px; font-size: 42px; margin-left: -45px;">send</mat-icon>
</i>
</button>
</div>
</div>
以及发送消息的方法:
sendTextMessage(event: any): void {
this.message = new ChatMessage();
if (this.selectedChatFriend) {
this.message.messageReceiverId = this.selectedChatFriend.id;
}
this.message.message = event.currentTarget.value;
this.txtSubject.next(null);
event.currentTarget.value = null;
this.txtMessage = null;
this.message.messageSenderId = this.userid;
this.message.type = "sent";
this.message.timeStamp = new Date();
if(this.message.messageReceiverId && this.message.message.length > 0){
debugger; //hier pauze is al genoeg om te werken :o
}
this.chatService.sendMessage(this.message);
}
发生了几件奇怪的事情:
一个。我只需要在退格键上按下 1 键即可删除空格(13 个字符),获取占位符并触发 isTyping。 -我尝试伪造 JQueryEvent 按键退格但没有得到结果。
B.If 我在 sendmessage 和 F10 上逐行进入浏览器调试模式,一切都按计划进行
-我试过设置延迟,重新整理代码的顺序,还是不是想要的结果
C.在我的 chat.html,用户输入消息的文本区域中,我有两种方法:
(input)="textinputreceived($event) 和
(keydown.enter)="sendTextMessage($event)
if i remove (keydown.enter), if event.currentTarget.value.length > 0 && event.inputType == "insertLineBreak" 不会在第一次回车时触发,只有在我'我打了一个退格键,它被触发了(可能是因为那个空白默认值..但其他问题出现了:)
我对打字稿还不是最有信心,所以可能缺少一些基本概念(也许阅读一些关于线程的内容)。
如果您知道如何解决这个问题,我很乐意听取您的意见!
我试过的其他随机事情:
尝试使用值绑定,尝试了 [] 和 [()],
将文本区域更改为 div,但没有成功..
更新:经过一番挖掘并将所有内容都放在一行中,我设法将空格减少到 1 个字符.. 尝试操纵 DOM 将其删除,但还没有成功..
对我来说最奇怪的是,这在我逐行调试时有效...
发现发生了什么!
(input)="textinputreceived($event)" 和 (keydown.enter)="sendTextMessage($event)">
触发一个 'enter press',所以在调试模式下,enterpress 被注册,文本被清除,消息被发送。如果不在调试中,enterpress 可能在该字段被清除后注册,因此出现空白。
简单的解决方案:
event.preventDefault() 两种方法!
textinputreceived(event: any){
if (event.inputType == "insertLineBreak"){
event.preventDefault();
}
sendTextMessage(event: any): void {
event.preventDefault();
//rest of logic
}
我正在调整基本的 SignalR 聊天功能。
广泛的上下文:当用户发送消息时,消息被发送,但是空的文本区域(除了占位符)已经被发送, 现在有一个 event.currentTarget.defaultValue,由大约 13 个空格组成的字符串。 我尝试通过将其设置为 null 或 '' 来更正它,但空白仍然存在,隐藏了占位符(偏离路线)。
原始输入字段是一个字符串,在我的版本中,我为其创建了一个 behaviorSubject,并添加了一个该 behaviorsubject 的可观察对象
txtMessage: string = null;
txtSubject: BehaviorSubject<string>;
txtStatus: Observable<string>;
this.txtSubject = new BehaviorSubject<string>(this.txtMessage);
this.txtStatus = this.txtSubject.asObservable();
this.txtStatus.subscribe(status => {
if(status !== null && status.length)
let senderid = this.userid;
let receiverid = this.selectedChatFriend.id;
let message = 'typing:' + senderid + ';receiver' + receiverid;
this.chatService.startedTyping(message);
}
if(status == null && this._selectedChatFriend !== null && this._selectedChatFriend !== undefined){
let senderid = this.userid;
let receiverid = this.selectedChatFriend.id;
let message = 'nottyping:' + senderid + ';receiver' + receiverid;
this.chatService.stoppedTyping(message);
}
});
问题: 当用户发送消息时,接收者会收到通知。 在发送第一条消息时,一切正常。在第一条消息之后,我得到的是空白而不是空文本区域,当这个用户再次开始输入时,isTyping 没有被触发,因为 'starttyping' 上的 ifstatement 没有预料到空白
textinputreceived(event: any){
if (event.currentTarget.value.length > 0 && event.inputType == "insertLineBreak"){
//event.preventDefault();
this.sendTextMessage(event.currentTarget.value);
}
//filter out anything that is not the txtMessage
if(event.currentTarget.value.length == 1 && event.inputType == "insertText"){
//user started typing
//triggers the isTyping
this.txtSubject.next(event.data);
} else if (event.currentTarget.value == '' && event.inputType == "deleteContentBackward"){
//user just deleted the only char in the message
//triggers stopped typing
this.txtSubject.next(null);
}
}
HTML:
<div class="type_msg">
<div class="input_msg_write">
<textarea type="text"
id="chatbx"
placeholder="Type a message"
class="write_msg"
[value]="txtMessage"
(input)="textinputreceived($event)"
(keydown.enter)="sendTextMessage($event)">
</textarea>
<button class="msg_send_btn"
type="button"
(click)="sendTextMessage($event)">
<i class="fa fa-paper-plane-o" aria-hidden="true">
<mat-icon style="color:black;margin-top:10px; font-size: 42px; margin-left: -45px;">send</mat-icon>
</i>
</button>
</div>
</div>
以及发送消息的方法:
sendTextMessage(event: any): void {
this.message = new ChatMessage();
if (this.selectedChatFriend) {
this.message.messageReceiverId = this.selectedChatFriend.id;
}
this.message.message = event.currentTarget.value;
this.txtSubject.next(null);
event.currentTarget.value = null;
this.txtMessage = null;
this.message.messageSenderId = this.userid;
this.message.type = "sent";
this.message.timeStamp = new Date();
if(this.message.messageReceiverId && this.message.message.length > 0){
debugger; //hier pauze is al genoeg om te werken :o
}
this.chatService.sendMessage(this.message);
}
发生了几件奇怪的事情:
一个。我只需要在退格键上按下 1 键即可删除空格(13 个字符),获取占位符并触发 isTyping。 -我尝试伪造 JQueryEvent 按键退格但没有得到结果。
B.If 我在 sendmessage 和 F10 上逐行进入浏览器调试模式,一切都按计划进行 -我试过设置延迟,重新整理代码的顺序,还是不是想要的结果
C.在我的 chat.html,用户输入消息的文本区域中,我有两种方法: (input)="textinputreceived($event) 和 (keydown.enter)="sendTextMessage($event)
if i remove (keydown.enter), if event.currentTarget.value.length > 0 && event.inputType == "insertLineBreak" 不会在第一次回车时触发,只有在我'我打了一个退格键,它被触发了(可能是因为那个空白默认值..但其他问题出现了:)
我对打字稿还不是最有信心,所以可能缺少一些基本概念(也许阅读一些关于线程的内容)。 如果您知道如何解决这个问题,我很乐意听取您的意见!
我试过的其他随机事情:
尝试使用值绑定,尝试了 [] 和 [()],
将文本区域更改为 div,但没有成功..
更新:经过一番挖掘并将所有内容都放在一行中,我设法将空格减少到 1 个字符.. 尝试操纵 DOM 将其删除,但还没有成功.. 对我来说最奇怪的是,这在我逐行调试时有效...
发现发生了什么! (input)="textinputreceived($event)" 和 (keydown.enter)="sendTextMessage($event)"> 触发一个 'enter press',所以在调试模式下,enterpress 被注册,文本被清除,消息被发送。如果不在调试中,enterpress 可能在该字段被清除后注册,因此出现空白。
简单的解决方案: event.preventDefault() 两种方法!
textinputreceived(event: any){
if (event.inputType == "insertLineBreak"){
event.preventDefault();
}
sendTextMessage(event: any): void {
event.preventDefault();
//rest of logic
}