更新:我在下面发布了我的代码解决方案作为答案,如果有人想查看 KnockoutJs 自定义绑定的完整(且相当简单)示例,这可能会有所帮助。
问题:
当我使用 jQuery 设置单选按钮的选中状态时……似乎我的 KnockoutJs 视图模型没有跟踪此更改!
场景:
我有多个大 DIV,每个 DIV 都包含一个单选按钮。(这使用户可以更轻松地通过单击更大的区域来单击单选按钮。)当用户单击 div 中的某个位置时,我想为他们检查单选按钮......这很好用。但是,当尝试从绑定到此单选按钮的 viewModel 属性中读取值时......它尚未更新。:-(
唯一一次更新viewModel是如果我直接单击div 内的单选按钮。如果我只是单击 div 内的某个位置(它执行我的 jQuery),那么....即使收音机明显被选中.... knockoutjs viewModel 属性尚未更新为新值。
问题: 有人可以告诉我如何使用 jQuery 更改单选按钮的选中状态,并让 KnockoutJs 可以很好地播放并进行更新吗?
代码如下,这里是 jsFiddle:http: //jsfiddle.net/CkEMA/67/
<script>
$(document).ready(function ()
{
var self = this;
function ViewModel()
{
this.HourlyOrSalary = ko.observable("");
}
viewModel = new ViewModel();
ko.applyBindings(viewModel, document.getElementById('divKnockout'));
// Click event for DIV around radio button
$('.divRadioWrapper').click(function ()
{
var radio = $(this).find('input[type="radio"]');
radio.prop('checked', true);
});
// Just for testing...
$('#testButton').click(function ()
{
var viewModelVal = viewModel.HourlyOrSalary();
alert('Value --> ' + viewModelVal);
});
});
</script>
<style>
.divRadioWrapper {
background-color: #dde9f5; /*#d8f5f0;*/ /* #dcfbff; */
width: 75px;
padding: 5px 10px;
border: 1px solid lightgray;
cursor: pointer;
margin-bottom: 10px;
}
</style>
<div id="divKnockout">
<div class="divRadioWrapper">
<input type="radio" name="formType" value="hourly" data-bind="checked: HourlyOrSalary"
/>Hourly</div>
<div class="divRadioWrapper">
<input type="radio" name="formType" value="salary" data-bind="checked: HourlyOrSalary"
/>Salary</div>
<br />
<input type="button" id="testButton" value="Display viewModel data" />
</div>