判断用户或编程是否更改了knockout observable

时间:2015-06-01 13:08:15

标签: knockout.js data-binding

我有一个带有observable的模型,绑定到带有值绑定的输入html字段。

我在很多方面对这个observable进行操作,但是我需要通过用户改变输入值或者以编程方式调用myObservable(someValue)来区分我的observable是否已被更改。我还有一个自定义绑定来执行一些操作,如格式化字符串,但在两种情况下都可以访问它,订阅也是如此。

所以,如果可能的话,我需要在自定义绑定或订阅处理程序中使用类似

的内容
if (this.hasBeenAlteredByUser()) //do something
else //something else

如果可能的话,我会避免键盘事件监控。

2 个答案:

答案 0 :(得分:4)

我认为你想要的是不可能。当你需要区别时,你并不完全明确 ,但如果它是在自定义绑定处理程序,手动订阅,扩展程序等中,我认为没有办法知道它的来源改变。

您可能遇到XY问题的案例,但在我们提供任何解决方案之前,您需要提供有关您实际想要做的事情的更多详细信息。

虽然可能解决Y问题的一个典型模式是使用可写的计算可观察量和额外的正常可观察量,例如:

var MyViewModel = function() {
    var self = this;

    self.myText = ko.observable('initial value');

    self.myTextSpecial = ko.computed({
        read: self.myText,
        write: function(newVal) {
            // Do special stuff here!
            // Plus also:
            self.myText(newVal);
        }
    });
}

然后,您可以在需要时直接操作“支持可观察”myText,并将计算出的observable绑定到input(反之亦然)。只有在编写计算的observable时才会发生“特殊事物”。

答案 1 :(得分:0)

我不认为这是xy问题的一个例子。事实上,我有许多可观察的绑定到输入,类似于250多个可观察对象,并且有很多方法可以被改变,有些会影响其他的,当xhr返回时会有一些变化,然后用户也可以改变它们。在这种情况下,必须采取进一步的行动。 问题是:当代码中的多个点改变绑定的封锁时,区分不一定代码我可以重构,使用obs(“something”),当用户编辑它时 - 没有xy,这就是我的要求。可能有其他方法可以实现相同的结果而不需要区分,但区分是最短,最简单的方法,我必须以最小的现有,非常长的代码重构。

在effec中,订阅或绑定中没有可能的解决方案来实现源消歧。

为了理解用户何时通过输入直接有效地改变oservable我解决了将每个输入的更改事件委托给容器中的处理程序,该容器将相对可观察性标记为用户改变,直到订阅/绑定在用户特定输入的特殊处理时取消标记执行。

感谢您的帮助,您回答了我的问题,告诉我在ko中无法区分更新源