Knockout - 具有手动更改通知的Computed Observable

时间:2016-10-24 06:33:18

标签: javascript knockout.js data-binding

在淘汰赛中我想写一个ComputedObservable,它是根据不可观察的值计算出来的。我想手动触发通知。

这有可能吗?

2 个答案:

答案 0 :(得分:1)

计算变量只不过是一个在其中的所有可观察对象上注册自定义事件的函数。

当您的内部可观察变量发生变化时,它会广播notify事件,并且所有侦听器都会捕获事件并进行相应处理。

这个过程听起来很简单但是当你计划在普通的Javascript变量上使用时却不是这样。您可以参考Listening for variable changes in JavaScript or jQuery

现在,如果您希望手动实现这一基本挑战:

  • 变量可以随时随地更改。您必须在任何地方手动触发其通知事件。如果你错过了,你的数据就会不正确。
  • 您还必须为绑定添加eventListeners。就像应该计算的total变量一样。
  • 浏览器支持。 IE8或之前的版本不支持自定义事件,您必须为其添加黑客。

我的建议是,使用带有可观察量的计算(或纯度计算,如果在KO3.2之上或之上)。这样您就可以节省大量代码。淘汰赛团队必须经历这些问题并在其代码中添加了处理。重新发明轮子会在codeBase中添加大量代码,如果没有适当的文档,将难以维护。

以下是Fiddle我在其中复制textInput绑定数字输入。如果你看到,他们分别处理 IE10 IE9 IE8或以下。他们甚至对5岁以下的 safari进行了特殊处理。

答案 1 :(得分:0)

我完全赞同在计算中使用ko.observable变量的其他答案。如果重新评估不是自动化的,我不明白你为什么要使用计算机。我建议改为创建一个普通函数。

我看到的最接近的方法是创建一个计算所订阅的虚拟observable。您可以致电valueHasMutated强制重新评估:

var a = "A";
var b = "B";

var subscriptionObs = ko.observable();

var ab = ko.pureComputed(function() {
  subscriptionObs();
  return a + b;
});

ko.applyBindings({ab: ab });


b = "C";
subscriptionObs.valueHasMutated();
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<p data-bind="text: ab"></p>