更新:コードソリューションを以下の回答として投稿しました。これは、KnockoutJsカスタムバインディングの完全な(そしてかなり単純な)例を見たい場合に役立ちます。
問題:
jQueryを使用してラジオボタンのチェック済みステータスを設定すると、KnockoutJsビューモデルがこの変更を追跡していないように見えます!
シナリオ:
複数の大きなDIVがあり、各DIVが1つのラジオボタンをラップしています。(これにより、クリックする領域が大きくなるため、ユーザーはラジオボタンをクリックしやすくなります。)ユーザーがdivのどこかをクリックしたときに、ラジオボタンをチェックしたいと思います。これは問題なく機能します。ただし、このラジオボタンにバインドされているviewModelプロパティから値を読み取ろうとすると、更新されていません。:-(
viewModelが更新されるのは、div内のラジオボタンを直接クリックした場合のみです。(jQueryを実行する)div内のどこかをクリックすると、ラジオが目に見えてチェックされたとしても....knockoutjsのviewModelプロパティは新しい値で更新されていません。
質問: jQueryを使用してラジオボタンのチェック状態を変更し、KnockoutJを適切に再生して更新する方法を教えてもらえますか?
コードは以下にあり、ここに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>