当值相同时,Knockout更新UI

时间:2014-01-21 06:34:12

标签: javascript knockout.js

我有一个带有值绑定的文本输入控件。对于value属性,我有一个扩展器。

整个想法是实现每当值被清空时我想要将其设置回旧值的情况。

Jsfiddle

ko.extenders.myextender = function (target, precision) {
//create a writeable computed observable to intercept writes to our observable
var result = ko.computed({
    read: target, //always return the original observables value
    write: function (newValue) {
        alert(target.peek());
        if (!newValue) {

            //target("");
            target(target.peek());
            target.notifySubscribers(target.peek());
        }
    }
});
return result;
}
function viewModel() {
    this.Value = ko.observable("abcd");
    this.Value.subscribe(function (newValue) {
        alert("Do something with the newValue");
    });
    this.Value = this.Value.extend({
        myextender: 0
    });
}
ko.applyBindings(new viewModel());

问题是每当我回退它没有反映在UI中的旧值时。

1 个答案:

答案 0 :(得分:2)

您当前的代码有两个问题:

  • target不为空时,不设置newValue属性。因此,当您在输入中更改某些内容时,它不会更新您的underlaying observable。

  • 在空值的情况下,您需要在计算机上调用notifySubscribers,而不是在uderlaying observable target上调用var result = ko.computed({ read: target, //always return the original observables value write: function (newValue) { if (!newValue) { target(target.peek()); // notify the subscribers to reset the value in the input result.notifySubscribers(target.peek()); } else{ // newValue is not empty so set the target target(newValue); } } }); 。因为您的计算机绑定在UI上,因此必须通知值绑定有关其值的更改。

所以你的固定计算机应该是这样的:

{{1}}

演示JSFiddle