[英]Dynamic Radio button bind checked property is dynamic
首先,我是新手,现在我正在创建一个“动态选项”的“未完成”项目,问题是我的ViewModel绑定到了我的ItemModel(其中包含5个属性HS01-HS02-HS03-HS04-HS05),当选择OptionsBox时需要绑定。 已检查:$ parent。(动态属性)似乎不起作用。
这是代码示例。
HTML
<input data-bind="value: HS01" />
<table class="table table-condensed">
<tbody data-bind="foreach: HealthAndSafety">
<tr>
<td class="col-xs-9">
<span data-bind="html: contenu"></span>
<!-- ko if: $data.id == 'HS01' -->
<br/>
<ul style="list-style-type: disc">
<!-- ko foreach: $root.HealthAndSafetyChild -->
<li data-bind="text: $data.contenuChild"></li>
<!-- /ko -->
</ul>
<!-- /ko -->
</td>
<!--<div style="border: 3px red dashed;">-->
<td class="col-xs-2">
<input type="radio" data-bind="attr:{value:id,name:group,checked: checkedProperty} , checkedValue: 0"/>
<input type="radio" data-bind="attr:{value:id,name:group,checked: checkedProperty} , checkedValue: 1"/>
</td>
</tr>
</tbody>
</table>
JavaScript(视图模型)在这里是每个UL具有多个Li等...那么它们只有1个是/否单选按钮,这些按钮绑定到父视图模型
m.HealthAndSafety = ko.observableArray([
{ id: 'HS01', group: 'HS01Group', checkedProperty: '$parent.HS01', contenu: f.lang('HealthSafety01') },
{ id: 'HS02', group: 'HS02Group', checkedProperty: '$parent.HS02', contenu: f.lang('HealthSafety02') },
{ id: 'HS03', group: 'HS03Group', checkedProperty: '$parent.HS03', contenu: f.lang('HealthSafety03') },
{ id: 'HS04', group: 'HS04Group', checkedProperty: '$parent.HS04', contenu: f.lang('HealthSafety04') },
{ id: 'HS05', group: 'HS05Group', checkedProperty: '$parent.HS05', contenu: f.lang('HealthSafety05') }]);
m.HealthAndSafetyChild = ko.observableArray([{ idChild: 'HS01_1', contenuChild: f.lang('HealthSafety01_1') }, { idChild: 'HS01_2', contenuChild: f.lang('HealthSafety01_2') }, { idChild: 'HS01_3', contenuChild: f.lang('HealthSafety01_3') }, { idChild: 'HS01_4', contenuChild: f.lang('HealthSafety01_4') }, { idChild: 'HS01_5', contenuChild: f.lang('HealthSafety01_5') }, { idChild: 'HS01_6', contenuChild: f.lang('HealthSafety01_6') }]);
当我发布模型更新数据库属性HS01等时,它们为null,并且未绑定。 我已经测试了多种情况,但是我不知道如何将ObservableArray(CheckedProperty)绑定到选中的属性。
我也尝试过
<input type="radio" data-bind="attr:{value:id,name:group} checked: (checkedProperty / #data.checkedProperty) , checkedValue: 0"/>
我在Stackoverflow上找到的所有示例都仅绑定到1个属性
谢谢!
编辑1 http://jsfiddle.net/grosjambon/azz3tpfy/7/
Edit2发现了一种更干净的方法来解决我的问题,虽然它仍然不是完全理想的,但是比其他具有html中If条件的问题更好。 在实施罗伊答案时
HTML
<div style="border: 3px red dashed;">
<label class="radio-inline">
<input type="radio" data-bind="attr:{name:id}, checked: checkedProperty, checkedValue: '1',event: {change : $root.onInputChangeUpdateVMHSProperty }" />
Yes
</label>
<label class="radio-inline">
<input type="radio" data-bind="attr:{name:id}, checked: checkedProperty, checkedValue: '0' ,event: {change : $root.onInputChangeUpdateVMHSProperty }" />
No
</label>
</div>
JavaScript的
m.onInputChangeUpdateVMHSProperty = function (item) {
switch (item.id) {
case "HS01":
m.HS01(item.checkedProperty());
break;
case "HS02":
m.HS02(item.checkedProperty());
break;
case "HS03":
m.HS03(item.checkedProperty());
break;
case "HS04":
m.HS04(item.checkedProperty());
break;
case "HS05":
m.HS05(item.checkedProperty());
break;
}
};
主要问题:
checked
属性,使用checked
绑定 checkedProperty
本身应该是一个observable 因此,数组的元素将如下所示:
{
id: 'HS01',
group: 'HS01Group',
group2: 'HS01Group2',
checkedProperty: ko.observable(),
contenu: 'test1'
}
您输入的行将是:
<div data-bind="foreach: HealthAndSafety">
<span data-bind="text: $index"></span>
<input data-bind="value: checkedProperty" />
</div>
您的单选按钮如下所示:
<input type="radio" data-bind="attr:{name:id}, checked: checkedProperty, checkedValue: '0'" />
function SeatReservation(name, initialMeal) { var self = this; self.name = name; self.meal = ko.observable(initialMeal); } // Here's my data model var ViewModel = function() { var self = this; self.HealthAndSafety = ko.observableArray([{ id: 'HS01', group: 'HS01Group', group2: 'HS01Group2', checkedProperty: ko.observable(), contenu: 'test1' }, { id: 'HS02', group: 'HS02Group', group2: 'HS02Group2', checkedProperty: ko.observable(), contenu: 'test2' }, { id: 'HS03', group: 'HS03Group', group2: 'HS03Group2', checkedProperty: ko.observable(), contenu: 'test3' }, { id: 'HS04', group: 'HS04Group', group2: 'HS04Group2', checkedProperty: ko.observable(), contenu: 'test4' }, { id: 'HS05', group: 'HS05Group', group2: 'HS05Group2', checkedProperty: ko.observable(), contenu: 'test5' }]); }; ko.applyBindings(new ViewModel()); // This makes Knockout get to work
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> <div> <h1> Just testing if the property get binded when u click a radioButton </h1> <h1> Example that works now </h1> <div data-bind="foreach: HealthAndSafety"> <span data-bind="text: $index"></span> <input data-bind="value: checkedProperty" /> </div> <table> <tbody data-bind="foreach: HealthAndSafety"> <tr> <td class="col-xs-2"> <input type="radio" data-bind="attr:{name:id}, checked: checkedProperty, checkedValue: '0'" /> <input type="radio" data-bind="attr:{name:id}, checked: checkedProperty, checkedValue: '1'" /> </td> </tr> </tbody> </table> </div>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.