我正在使用角度4的应用程序中实现私人消息系统。当用户点击其收件箱中的未读消息(可能构成一个也可能未读的线程中的多个消息之一)时,所有消息应该在线程中返回但我还想检查是否有任何消息未读,并将它们标记为读取作为此方法的一部分。
获取消息的调用如下所示:
Dim Resp As HttpResponse = HttpContext.Current.Response
Resp.Headers.Remove("X-Frame-Options")
Resp.AppendHeader("X-Frame-Options", "SAMEORIGIN")
并在组件中:
getMessageThread(id: number, recipientId: number) {
return this.authHttp.get(this.baseUrl + 'users/' + id + '/messages/' + recipientId)
.map(response => response.json())
.catch(this.handleError);
}
我在服务中也有以下方法,如果线程中的任何返回消息被标记为未读,则应有条件地调用该方法:
loadMessageThread() {
const currentUserId = +this.authService.decodedToken.nameid;
this.userService.getMessageThread(currentUserId, this.userId).subscribe(messages => {
this.messages = messages;
}, error => {
this.alertify.error(error);
});
}
到目前为止,我尝试了几种不同的选择。如果我尝试从订阅中调用用户服务,则会收到错误消息,指出用户服务未定义:
markAsRead(userId: number, messageId: number) {
return this.authHttp.post(this.baseUrl + 'users/' + userId + '/messages/' + messageId, {}).subscribe();
}
如果我在订阅之前尝试使用'do'方法,那么也无法在服务中调用该方法并直接进入错误条件而无需点击subscribe方法:
loadMessageThread() {
const currentUserId = +this.authService.decodedToken.nameid;
this.userService.getMessageThread(currentUserId, this.userId)
.subscribe(messages => {
this.messages = messages;
_.each(this.messages, function(message) {
if (message.read === false && message.recipientId === currentUserId) {
console.log(message) // works
this.userService.markAsRead(currentUserId, message.id); // fails
}
});
}, error => {
this.alertify.error(error);
});
}
我不确定我是否过度思考这一点,并且错过了一个更明显的方法。任何帮助或建议将不胜感激。
谢谢,Neil
答案 0 :(得分:1)
_.each(this.messages, function (message) {
应该是
_.each(this.messages, (message) => {
否则this
将不会引用该组件。