我有一个计划在其中收集多个人的信息。每个人的回复很有可能完全相同,但是我想让人们能够给出自定义的回复,同时保持简单。因此,我举了一个例子:
http://jsfiddle.net/r29xtLaq/1/
这是一个非常简单的输入形式:
<p>Person 1: <input data-bind='value: person1' /></p>
<p>Person 2: <input data-bind='value: person2' /></p>
在此jsfiddle中,我希望这样,以便当我填写person1的值时,由于person2的值为空,因此该值将在开始时自动级联到person2。但是它们都由单独的可观察对象支持,因为在为用户预填充person2之后,她(或他)可以编辑person2,并且不会级联回到person1。
最佳答案
您是否已尝试完成此任务?通过在Knockout中实现自定义扩展程序,这应该相当简单,该扩展程序订阅值更改并检查其他值是否为空并将其填充。
例如补充剂-
ko.extenders.setOthersOnChange = function(target, others) {
target.subscribe(function(newValue) {
ko.utils.arrayForEach(others, function (other) {
if (!ko.unwrap(other)) {
other(newValue);
}
});
});
return target;
};
在您的VM中-
this.person2 = ko.observable().extend({ setOthersOnChange: [] });
this.person1 = ko.observable().extend({ setOthersOnChange: [this.person2] });
这样做的好处是,您可以拥有其他依赖的可观察对象的
n
数量,而无需增加必须手动创建的订阅数量。我还建议您确保正确处置它们。更新了小提琴以供引用
http://jsfiddle.net/r29xtLaq/3/