如何在计算回调函数中立即修改knockout.js observable?

如何在计算回调函数中立即修改knockout.js observable?,knockout.js,Knockout.js,我使用的是knockout.js3.0,我得出了一些简单的结论: var self = this; self.selectedItem = ko.observable("default text"); ko.computed(function () { if (this.selectedItem() != "default text") { this.selectedItem("success"); } }, self); 但当我改变我的可观测值时,计算回

我使用的是knockout.js3.0,我得出了一些简单的结论:

 var self = this;
 self.selectedItem = ko.observable("default text");
 ko.computed(function () {
    if (this.selectedItem() != "default text") {
       this.selectedItem("success");
    }
 }, self);

但当我改变我的可观测值时,计算回调函数再次触发。那么如何预防它呢?

您似乎对如何使用计算的可观测值感到困惑,因为您根本没有将可观测值保存在
self
的属性上

在任何情况下,您都会做两件事情,这两件事情结合起来会给您带来问题:

  • 使计算结果取决于可观察的
    selectedItem
  • 让计算的更新
    选择editem
  • 这将(或至少:可能)导致一个无休止的循环,因为每次潜在的可观测变化时都会重新计算计算结果,但它改变了可观测本身

    即使您可以,在计算的可观察变量中更新(可观察)变量可能根本就不明智,至少在
    read
    (又称“getter”)版本中是不明智的


    注:您可能正在查找。

    通常,您为计算函数指定一个变量名,以便可以从视图中的某个位置引用它。此外,computed不是“回调”,这是完全不同的事情,尽管我认为computed可以用作回调函数。ko计算的可观测值通常是您希望对其他可观测值的变化做出反应的可观测值,尽管它还有许多其他用途

    var self = this;
    self.selectedItem = ko.observable("default text");
    self.testTextChange = ko.computed(function () {
        if (self.selectedItem() != "default text") {
           alert("success"); // Changed this to alert, otherwise, you will change the value of the input as you stated in your question.
        }
    });
    
    那么在你看来

    <input data-bind="text: selectedItem" />
    <button data-bind="click: testTextChange">Click Me</button>
    
    
    点击我
    

    不过,这是一个完全任意的示例,它提出了几个问题,您的
    数据绑定视图中有哪些内容,您到底想用这些内容做什么

    您可以使用如下可写的计算可观察对象:

    var self = this;
    self.selectedItem = ko.observable("default text");
    self.notifySelectedItem = ko.computed({
      read: self.selectedItem,
      write: function (value) {
        if (this.selectedItem() != "default text") {
          self.selectedItem(value);
          alert("success");
        }
      }
    });
    

    使用notifySelectedItem而不是selectedItem,无论您在哪里需要通知更改。它将显示selectedItem值,并在更新时调用写入回调。您可能需要移动self。根据您的需要,在if块外选择editem(value)。

    我不确定为什么这个答案会被否决,有什么改进的建议吗?不确定我是否总是需要将computed保存在self属性中。我会尝试使用“setter”,谢谢,但我不明白我该怎么处理这个。。我尝试实现“读”和“写”回调函数,并将计算结果保存为模型属性。现在没有任何可观察的(意思是selectedItem),只是计算出来的。但在塞特我不能修改计算。我想这是不可能的,我会设法找到其他的解决办法。(有一个想法:添加一些条件来防止循环-不优雅,但它可以解决我的问题)谢谢回复!我认为我不需要testTextChange变量,因为在这个“触发器”(这是一个好名字吗?)函数中,我发出了ajax请求。还有一些其他条件,因此可能是我需要恢复更改的情况。对不起,如果我在我的例子中弄错了。。通常我需要设置前面的值,比如if(this.selectedItem()!=“default text”){this.selectedItem(“default text”);}