Angular Socket.io更新现有发出的消息

时间:2019-01-16 16:55:20

标签: node.js angular socket.io

我很难解决这个问题。我希望有人可以帮助您得出解决方案的结论。我正在使用一个聊天应用程序。我希望人们能够更新已经发出的消息。

这是聊天的html代码。

def _get_salary_rule(self):
  rule = self.env['hr.salary.rule'].search([('name', '=', 'SALARY_RULE_NAME')])
  return rule

当用户点击投票时,消息的等级就会更新。

component.ts

<div id="message-box-container" class="message-container">
  <div class="message-box" *ngFor="let message of messages">
    <div class="plus-minus">
      <div class="vote-plus" (click)="vote(message.messageid, 1)">
      </div>
      <div class="vote-minus" (click)="vote(message.messageid, -1)">
      </div>
    </div>
    {{message.message}} {{message.rank}}
  </div>
</div>

该投票进入我的组件类,然后将其发送到我的服务类,该投票在我的节点服务器上发出。

  ngOnInit() {
    this.chatService.joinMainChat('');

    this.chatService
      .getMessages()
      .subscribe((message: MessageObj) => {
        this.messages.push(message);
      });
  }
      vote(id: number, yn: number) {
        this.chatService.vote(id, yn);
      }

这是此操作的节点服务器代码:

  public vote(id, num) {
    var voted = {id: id, vote: num};
    this.socket.emit('vote', voted);
  }

现在,投票方面可以在后端使用。正确的消息正在获得正确的投票。

问题在于前端html代码未更新消息的排名。

老实说,我不知道该怎么做,我也无法解决这个问题。

我希望返回新等级并用新等级更新指定的消息。我只是不确定如何执行此操作。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

据我了解,在服务器端,您并没有单独维护投票,您只是在添加现有投票以及来自前端的新投票。为了能够更新发出的消息,您的服务器必须知道旧投票中提供的是旧投票。因此,要实现更新发出的投票,您的客户必须提供旧投票以及要更新的新投票,以便服务器可以减去旧投票并添加新投票。

下面是您需要在angular中添加的客户端额外类。

public vote(id, oldNum, newNum) {
  var voted = { id: id, oldVote: oldNum, newVote:newNum };
  this.socket.emit('updateVote', voted);
}

此服务的调用方式与发送新投票的方式相同,但需要提供oldVotenewVote

下面是服务器端代码,用于接受对发出的投票进行的此编辑。在这里,您需要再添加一个事件监听器,以编辑发出的投票。

socket.on('updateVote', (ballet) => {
  messageList[ballet.id].rank -= ballet.oldVote;
  messageList[ballet.id].rank += ballet.newVote;
  io.to('main room').emit('new-message', messageList[ballet.id]);
});

在代码上方,减去已发出的投票并添加新的投票。