【问题标题】:Discriminate if knockout observable has been changed by user or programatically区分淘汰可观察对象是否已由用户或以编程方式更改
【发布时间】:2015-06-01 13:08:15
【问题描述】:

我有一个带有可观察模型的模型,它通过值绑定绑定到输入 html 字段。

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

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

if (this.hasBeenAlteredByUser()) //do something
else //something else

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

【问题讨论】:

    标签: knockout.js data-binding


    【解决方案1】:

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

    您可能有 XY 问题的案例,但您需要提供更多详细信息(可能是在一个新问题中)关于您实际想要做什么,然后我们才能提供任何解决方案。

    想到的一个典型模式虽然可能是 Y 问题的解决方案,但它是使用可写计算 observable 和额外正常 observable,例如:

    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);
            }
        });
    }
    

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

    【讨论】:

    • 在已经有大量 observable 的页面中复制 observable 数字并不是一个好主意,特别是如果必须为旧版浏览器授予支持 - 但又无法区分更改源
    【解决方案2】:

    我认为这不是 xy 问题。事实是,我有许多绑定到输入的可观察对象,例如 250 多个可观察对象,并且可以通过多种方式更改它们,有些会影响其他,有些会在 xhr 返回时发生更改,然后用户也可以更改它们。在这种情况下,必须执行一些进一步的操作。 问题是:区分绑定的obs何时被代码中的多个点更改,不一定是我可以重构的代码,使用obs(“某物”),以及当它由用户编辑时 - 没有xy,这就是我要问的。可能有其他方法可以在不需要区分的情况下获得相同的结果,但区分是最短、最简单的方法,我必须至少重构现有的非常长的代码。

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-03-30
      • 2013-07-25
      • 2015-01-25
      • 2014-11-05
      • 2013-05-30
      • 1970-01-01
      • 2014-08-08
      • 2017-09-19
      相关资源
      最近更新 更多