【问题标题】:Knockout Subscribe - User update vs system update淘汰订阅 - 用户更新与系统更新
【发布时间】:2017-10-20 13:38:15
【问题描述】:

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

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

其他客户端可以很好地获取消息,然后根据需要更新字段,但我的问题是,当系统更新字段时,它会触发另一个更新以发送到服务器,因为订阅被触发并且各种循环不良问题。

你们有没有一种聪明的方法可以知道一个动作是由用户触发还是由系统触发的?

【问题讨论】:

    标签: javascript node.js knockout.js


    【解决方案1】:

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

    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>

    【讨论】:

      【解决方案2】:

      想过在对象上使用一个标志来检查它是否正在更新,但发现更新发生得太快,以至于当订阅者开始检查标志时,它已经被设置回来了。

      最终采用混合方法:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-11
        • 2013-04-14
        相关资源
        最近更新 更多