在您提供的示例中,您正在使用以下代码更新输入框:
this.setAgeExternally = function(){
$('input').val(0);
}
考虑到输入绑定到年龄属性,这样做会更简单:
this.setAgeExternally = function(){
this.age(0);
}
然而,即使这样也不是真的需要,因为年龄属性暴露在你的视图模型上。所以外部代码可以做到这一点,而 setAgeExternally 方法并不是真正需要的:
model.age(0);
让我们回到您最初的问题 - 您描述但未发布代码的问题。您提到您有一个绑定到可观察数组的输入框列表。
使用 observable 数组时需要注意一个有趣的问题:
从http://knockoutjs.com/documentation/observableArrays.html的文档中:
关键点:一个 observableArray 跟踪数组中有哪些对象,而不是那些对象的状态
简单地将一个对象放入 observableArray 并不能使该对象的所有属性本身都可观察。当然,如果您愿意,您可以使这些属性可观察,但这是一个独立的选择。observableArray 只跟踪它持有的对象,并在添加或删除对象时通知侦听器。
鉴于您列出的要求,根本不需要 jQuery。您可以尝试以下三部分解决方案:
让你的 observableArray 包含 observables。所以你最终会得到类似的东西:
var model = function() {
this.ages = ko.observableArray([
{age: ko.observable(13)},
{age: ko.observable(18)},
{age: ko.observable(16)},
{age: ko.observable(13)}
]);
};
接下来,创建一个敲除扩展器,如果为空,它会自动重置为 0
ko.extenders.defaultIfBlank = function(target, defaultValue) {
var result = ko.computed({
read: target, //always return the original observables value
write: function(newValue) {
if (newValue == "") {
target(defaultValue);
} else {
target(newValue);
}
}
});
//initialize with current value to make sure it is not blank
result(target());
//return the new computed observable
return result;
};
将扩展器应用于数组中的可观察对象
var model = function() {
this.ages = ko.observableArray([
ko.observable(13).extend({defaultIfBlank: "0"}),
ko.observable(18).extend({defaultIfBlank: "0"}),
ko.observable(16).extend({defaultIfBlank: "0"}),
ko.observable(13).extend({defaultIfBlank: "0"})
]);
};
工作小提琴:http: //jsfiddle.net/tlarson/GF3Xe/