Javascript 共享观测值

Javascript 共享观测值,javascript,knockout.js,knockout-2.0,Javascript,Knockout.js,Knockout 2.0,我有两个送货类型表格(带有姓名、地址、邮政编码等),还有一个按钮,上面写着“送货地址与送货地址相同”。基本上,我正在尝试这样做,当用户单击该按钮时,来自第一个字段的相同观察值将与第二个字段共享。我是如何做到这一点的(可能是非常错误的)是通过设置两组观察值,如下所示: self.firstName = ko.observable(""); self.lastName = ko.observable(""); self.phoneNumber = ko.observable("");

我有两个送货类型表格(带有姓名、地址、邮政编码等),还有一个按钮,上面写着“送货地址与送货地址相同”。基本上,我正在尝试这样做,当用户单击该按钮时,来自第一个字段的相同观察值将与第二个字段共享。我是如何做到这一点的(可能是非常错误的)是通过设置两组观察值,如下所示:

    self.firstName = ko.observable("");
    self.lastName = ko.observable("");
self.phoneNumber = ko.observable("");
self.address1 = ko.observable("");
self.address2 = ko.observable("");
self.city = ko.observable("");
self.state = ko.observable("");
self.postcode = ko.observable("");

    self.delFirstName = ko.observable("");
    self.delLastName = ko.observable("");
self.delPhoneNumber = ko.observable("");
self.delAddress1 = ko.observable("");
self.delAddress2 = ko.observable("");
self.delCity = ko.observable("");
self.delState = ko.observable("");
self.delPostcode = ko.observable(""); 
然后我试着设置一个函数,当点击它时,它会在所有人之间共享运送细节

self.sameDelAddress = function() {
    self.delFirstName() = self.firstName(self.firstName);
            self.delLastName() = self.lastName(self.lastName);
    self.delPhoneNumber() = self.phoneNumber(self.phoneNumber);
    self.delAddress1() = self.address1(self.address1);
    self.delAddress2() = ko.observable(self.address2);
    self.delCity() = ko.observable(self.city);
    self.delState() = ko.observable(self.state);
    self.delPostcode() = ko.observable(self.postcode);
}

我想你想要的是下面的代码。以fiddle为例,了解一个有效的示例

选中复选框后,尝试更新一个字段,您将看到另一个字段自动更新

function addressModel() {
    var self = this;
    self.firstName = ko.observable("");
    self.lastName = ko.observable("");
    self.phoneNumber = ko.observable("");
    self.address1 = ko.observable("");
    self.address2 = ko.observable("");
    self.city = ko.observable("");
    self.state = ko.observable("");
    self.postcode = ko.observable("");
}

function deliveryModel(shipAddress, billAddress) {
    var self = this;
    self.shippingAddress = ko.observable(shipAddress);
    self.billingAddress = ko.observable(billAddress);
    self.addressesAreSame = ko.observable();

    self.addressesAreSame.subscribe(function(newValue){
        if(newValue===true){
            self.billingAddress(self.shippingAddress());
        }else{
            self.billingAddress(new addressModel());
        }
    });
}

var delivery = new deliveryModel(new addressModel(), new addressModel());
ko.applyBindings(delivery);
绑定示例:

<div data-bind="with: shippingAddress">
    Shipping Address<br />
    <input type="text" data-bind="value: address1" />
</div>
<div data-bind="with: billingAddress">
    Billing Address<br />
    <input type="text" data-bind="value: address1" />
</div>
<input type="checkbox" data-bind="checked: addressesAreSame" /> Billing same as shipping

发货地址
帐单地址
账单与发货单相同
原版中的情感受到赞赏-但是,在如此多的问题中感到气馁!欢迎来到Stack Overflow,@Steven!请访问stackoverflow.com/about查看问题格式,以获得最佳答案!很难看出你的问题是什么——这对你不起作用吗?你有什么迹象表明它不起作用?(例如,当您单击时,可能不会共享观察到的内容。)抱歉,只是看到了这些评论。仍然习惯堆栈溢出,伟大的资源!这不起作用,在Chrome的控制台上似乎没有任何东西。我可能需要对错误处理有一个长期的了解。基本上,观测值没有分配给它们的del前置对应项,也没有告诉我为什么。这真的让我大吃一惊,但有了Dans解决方案,我开始了解更多关于如何在KO中分配变量的信息。我将进一步阅读此内容(以及SO的“关于”部分),如果在我完成后发布解决方案很酷,我将发布。@Wojciech我修改了我的答案以处理复选框的选择和取消选择。非常感谢您的帮助,Dan!我回家后会试试这个,然后告诉你结果。再次感谢您抽出时间,非常感谢!