我有一个对象Address
。地址中包含street
,country
,state
,IsDefault
等字段。地址可以是多个,IsDefault将是无线电
按钮。
$.each(self.Addresses(), function (index, address) {
address.Street = ko.observable(adderss.Street);
address.State = ko.observable(address.State);
address.Country = ko.observable(address.Country);
address.IsDefault = ko.observable(address.IsDefault.toString());
address.IsGlobalCheckbox = ko.computed({
read: function () {
return address.IsDefault() + "";
},
write: function (v) {
if (v == "true") {
address.IsDefault(true)
}
else {
address.IsDefault(false)
}
}
});
});
Html内容将是
<div data-bind="foreach: Addresses">
<div>
Address <span data-bind="text: ($index() + 1)" class="mrl"></span>
<input name="contactAddress" type="radio" data-bind="checked:IsGlobalCheckbox,attr: { value:IsDefault }" />
<span>Primary</span>
<div data-bind="attr:{id:'address'+($index() + 1)}" class="in">
<div class="row">
<div class="form-group">
<label>Street 1</label>
<input type="text" data-bind="value: Street" />
</div>
</div>
<div>
<div class="form-group medium">
<label >Country</label>
<input data-bind="value:Country" />
</div>
<div class="form-group medium">
<label>State</label>
<input type="text" data-bind="value:State" />
</div>
</div>
</div>
当我更改一个默认地址时,它正在改变,但剩下的是默认的可观察数据没有改变。希望你理解我的问题。
我附上一个小提琴,在小提琴中解释我的要求http://jsfiddle.net/Naidu526/fzX8C/2/
当我将IsDefault从一个字段更改为另一个字段时,其他可观察值不会改变。请检查下面显示的json格式
答案 0 :(得分:1)
问题在于,您永远不会清除/伪造之前选择的Address
状态,也无法访问该值。
使用和复制(请参阅IsGlobalCheckbox
)每个IsDefault
中Address
的值没有多大意义。如果只能选择1并且要将状态传达给所有其他状态,则该上下文属于Address
模型的上方/外部。即使是当前的命名也表明它不属于那里。
因此,在$root
/ $parent
中定义一个新的observable,具体取决于要存储Primary Address
的生产模型的整体结构。
self.primaryAddress = ko.observable();
更改html绑定以使用checkValue
绑定的checked
参数,以便实际Address
存储在模型中。
<input name="contactAddress" type="radio" data-bind="checked:$root.primaryAddress, checkedValue: $data" /> <span>Primary</span>
现在我们有适当的设置来“监听”更改并相应地修改IsDefault
。
有两种选择:
primaryAddress
IsDefault
转换为依赖于primaryAddress
我喜欢选项#2。
address.IsDefault = ko.computed(function(){
return address === self.primaryAddress()
});
请确保包含初始化:
if(address.IsDefault == "true"){
self.primaryAddress(address)
}
有关完整设置,请参阅my fiddle。我还在注释掉的代码中包含选项#1作为参考。