9

我正在使用带有受保护的 observable 的 knockoutjs,并且遇到了复选框问题。可以在此处找到一种受保护的 observables 的实现,但我见过一些非常相似的实现。

可以在此处找到演示我的问题的 jsFiddle 。这是小提琴的一部分。

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

    self.protectedBool = ko.protectedObservable(true);
    self.commit = function(){
        ko.commitProtectedObservables(self);
    };
    self.rollback = function() {
        ko.rollbackProtectedObservables(self);
    };
};

$(function() {
    ko.applyBindings(new ViewModel());
});

要复制,请执行以下操作:

  1. 运行小提琴(复选框的默认值为 true)
  2. 取消选中复选框
  3. 点击“提交”
  4. 请注意,该值现在显示为 false(这是正确的行为)
  5. 再次运行小提琴(复选框的默认值为 true)
  6. 取消选中复选框,然后立即检查(在单击“提交”之前)
  7. 点击“提交”
  8. 您将看到该值将设置为 false/unchecked,即使在您单击“提交”时它已被选中。

在 protectedObservable 定义中计算的 observable 中的“write”事件不会在您第二次更改复选框时被触发,因此当提交值时,它会提交不正确的值。

另请注意,protectedObservable 非常适用于字符串。任何指导将不胜感激。

4

1 回答 1

11

protectedObservable的实现已经很老了。它仅适用于旧版本的 KO (<2)。

对于新的 KO 版本,请参阅同一作者 (Ryan Niemeyer) 实现的编辑器模式 - http://www.knockmeout.net/2013/01/simple-editor-pattern-knockout-js.html

于 2013-04-30T18:04:49.900 回答