Knockout订阅 - 用户更新与系统更新

时间:2017-05-20 13:55:16

标签: javascript node.js knockout.js

我目前在NodeJS中运行了一个带有Knockout,HTML,JS前端的多客户端应用程序。我在页面上有一些带有Knockout订阅的字段,这样当用户进行更改时,它会被发送到服务器,然后广播到服务器。

this.Name.subscribe(function(newValue) {
      Helpers.SendUpdate(this._id, "resources", { "Name": newValue });
}, this);

其他客户端获取消息正常,然后根据需要更新字段但我的问题是,当系统更新字段时,它会触发另一个更新,以便在订阅被触发时发送到服务器并且各种类型的循环的不良情绪。

您是否有一种聪明的方式可以让您知道用户或系统是否触发了某个操作?

2 个答案:

答案 0 :(得分:0)

您可以存储应用是否正在处理另一个变量中的服务器更新,并在您的订阅者中检查此状态:



var VM = function() {
  
  this.someObs = ko.observable(0);
  this.inServerUpdate = false;

  this.serverUpdate = function() {
    this.inServerUpdate = true;
    this.someObs(Math.round(Math.random() * 100));
    this.inServerUpdate = false;
  }.bind(this);

  this.someObs.subscribe(function(val) {
    if (!this.inServerUpdate) {
      console.log("Post", val, "to server");  
    }
  }, this);
}

ko.applyBindings(new VM());

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<input data-bind="value: someObs">
<button data-bind="click: serverUpdate">mimic server update</button>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

考虑在对象上使用一个标志来检查它是否正在更新,但发现更新发生的速度非常快,以至于当用户检查标志时它已被设置回来。

采用混合方式:

首先,我向请求添加了一个唯一的会话ID,以了解更新来自哪个客户端。这意味着当广播消息时,客户端可以忽略它。

其次,我使用下面链接的解决方案执行静默更新,并确保订阅没有再次启动。

Change observable but don't notify subscribers in knockout.js