区分可观察到的敲除是否已被用户或以编程方式更改

Discriminate if knockout observable has been changed by user or programatically

我有一个带有可观察对象的模型,绑定到具有值绑定的输入 html 字段。

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

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

的东西
if (this.hasBeenAlteredByUser()) //do something
else //something else

我会尽可能避免键盘事件监控。

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

您可能遇到了 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);
        }
    });
}

然后您可以在需要时直接操作 "backing observable" myText,并将计算的可观察值绑定到您的 input(反之亦然)。只有在写入计算的可观察对象时才会发生 "special stuff"。

我认为这不是 xy 问题。事实是我有很多 observable 绑定到输入,比如 250+ observables,并且有很多方法可以改变它们,一些影响其他,一些在 xhr 的 return 时改变,然后用户也可以改变它们.在这种情况下,必须执行一些进一步的操作。 问题是:区分绑定的 obs 何时被代码中的多个点改变,不一定是我可以重构的代码,使用 obs("something"),以及当它被用户编辑时 - 没有 xy,这就是我要问的.可能有其他方法可以在不需要区分的情况下实现相同的结果,但区分是最短、最简单的方法,我必须至少重构现有的、很长的代码。

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

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

感谢您的帮助,您回答了我的问题,告诉我 ko 中没有内置的方法来区分更新源