【问题标题】:Knockout observable shared between browsers - Subscribe only when value changed locallyKnockout observable 在浏览器之间共享 - 仅在本地值更改时订阅
【发布时间】:2014-07-07 06:26:12
【问题描述】:

我想在所有连接到该网页的用户之间共享一些可观察的数据。

当一个 observable 被修改时,更新的值被发送到后端(在我的例子中使用 socket.io 或任何其他方法)。

当后端收到更新的值时,它正在将值发送给所有用户。甚至是发送新值的用户。我无法更改后端的这种行为。

为了验证 observable 是否发生了变化,我使用了 observable 的 subscribe 方法。

如何在 subscribe 方法中知道 observable 是否已在本地或远程修改,以便只有在本地修改值时才能将值发送到后端?

下面的一些代码:

我的观察:

self.param1 = ko.observable(0);

已订阅将更新发送到后端

self.param1.subscribe(function() {
    // send value to backend
    // this function should not start if param1 is modified remotely
    // to avoid loops 
});

当从后端接收到新值时,可观察对象被远程修改

self.param1(new_value_received_from_backend);

Here is a JSFiddle simulating the problem

尝试以非常快的速度更改参数两次,您会注意到创建了一个循环,并且参数每两秒在两个值之间更改一次。

【问题讨论】:

  • Observables 如果它们的值没有改变就不会触发它们的订阅者。因此,如果任何人(服务器或客户端)更新该值,订阅者将被触发一次。如果再次收到相同的值,则不会触发订阅者。不应该有循环。
  • 如果服务器和客户端之间存在延迟,仍然会发生循环。自己尝试一下,在不到两秒的时间内将 JSFiddle 中的一个参数更改两次。
  • 嗯,只是,但如果视图(模型)应该根据更改是在本地还是远程完成(或更抽象:基于哪个客户端更改它)做出不同的响应,您可以需要在您的 DTO 和 ViewModel 中建模。
  • 我尝试将本地和远程 observables JSFiddle 分开。我认为现在不会发生循环,因为只有当用户单击参数时,本地 observable 才会设置为远程。但是点击它时它仍然将远程值发送到后端。这又回到了如何在某些情况下停止订阅触发的问题。
  • 当然,在这种情况下,可以在订阅函数中验证本地值与远程值不同...在下面创建答案。

标签: knockout.js


【解决方案1】:

按照 Jeroen 的建议,我将 observable 一分为二:

self.param1_local

和

self.param1_remote

仅当 self.param1_local 被修改且与 self.param1_remote 不同时,参数的值才会发送到后端

JSFiddle link

【讨论】:

    猜你喜欢
    • 2017-10-18
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 2019-02-06
    • 2013-04-17
    • 1970-01-01
    相关资源
    最近更新 更多