2017-09-21 14 views
0

私は角度4を使用するアプリケーションでプライベートメッセージシステムを実装しています。ユーザーが受信トレイ内の未読メッセージをクリックすると(スレッド内の複数のメッセージの1つを構成する可能性があります)それも未読かもしれません)すべてのメッセージはスレッドに返されるべきですが、メッセージのいずれかが未読であるかどうかを確認し、このメソッドの一部として読み取ったものとしてマークします。次のようにメッセージを取得するために角度結合Http条件付きhttp投稿で応答を得る

呼び出しが見えます:

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(); 
} 

これまでのところ、私はいくつかの異なるオプションを試しました。私は以前、これはまた、メソッドを呼び出すために失敗したサブスクライブに「を実行」メソッドを使用してみた場合

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); 
    }); 
} 

:私がしようとするとサブスクライブの中から、ユーザーサービスを呼び出す場合、私は、ユーザサービス定義されていないを示すエラーを取得しますサービスにサブスクライブ方法を押すことなく、エラー状態にまっすぐに行く:

loadMessageThread() { 
const currentUserId = +this.authService.decodedToken.nameid; 
this.userService.getMessageThread(currentUserId, this.userId) 
    .do(messages => { 
    _.each(messages, function (message: IMessage) { 
     if (message.read === false && message.recipientId === currentUserId) { 
    console.log(message) // works 
     this.userService.markAsRead(currentUserId, message.id); // fails 
     } 
    }); 
    }) 
    .subscribe(messages => { 
    this.messages = messages; 
    }, error => { 
    this.alertify.error(error); 
    }); 
} 

私はこれをoverthinkingていますし、これまでより多くの明白なアプローチをしないのですかはわかりません。助けや助言をいただければ幸いです。

おかげで、ニール

+1

Observablesをチェーンしようとしているようです。それを達成するためにRxJsの 'mergeMap()'メソッドを見てください。 [this](https://stackoverflow.com/questions/40239552/angular-2-chain-observables-in-resolver)も役立つかもしれません。 – Stanislasdrg

答えて

1
_.each(this.messages, function (message) { 

はそうthisは、コンポーネントを参照しています

_.each(this.messages, (message) => { 

でなければなりません。

関連する問題