我有一个计划在其中收集多个人的信息。每个人的回复很有可能完全相同,但是我想让人们能够给出自定义的回复,同时保持简单。因此,我举了一个例子:

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/

07-24 18:03