全体として、選択したチェックボックス ID を追跡するオブジェクトがあります。これを行う方法は、ID を配列にプッシュ/スライスすること$Grid.selectedRows
です。このオブジェクトは、「refresh」メソッドも更新ボタンにバインドします。そのオブジェクトを作成したクラスがありますKendoGridSelection
。
私の問題は、クラス内にバインドされたボタンが正しい配列値を表示するのに対し、パブリック プロパティでクラス外にバインドされたボタンは、ボタンがクリックselectedRows
された後に更新されないことです。refresh
テスト目的で、2 つのseeSelectedRowsArray
ボタンがあります。
seeSelectedRowsArray
ボタン (内部バインド)seeSelectedRowsArray2
ボタン (クラス外にバインド)
Chrome バージョン 28.0.1500.95 m でテストしています
これが私のコードです:
JS
var KendoGridSelection = function (gridID, pagerSelector) {
var $Grid = this;
$Grid.selectedRows = [];
$Grid.gridID = gridID;
$Grid.pagerSelector = pagerSelector;
$Grid.grid = $($Grid.gridID).data('kendoGrid');
$Grid.pager = $($Grid.pagerSelector).data('kendoPager');
$Grid.gridCheckboxes = $('input[type=checkbox]', $Grid.gridID);
$Grid.gridRows = $('table tbody tr', $Grid.gridID);
$Grid.refreshButton = $('.refreshButton', $Grid.gridID);
$Grid.bindUIEvents = function () {
$Grid.gridCheckboxes = $('input[type=checkbox]', $Grid.gridID);
$Grid.gridRows = $('.row', $Grid.gridID);
// Row click event
/*$($Grid.gridRows).click(function (e) {
if (!$(e.target).parent().hasClass('k-hierarchy-cell')) $(this).find('input[type=checkbox]').click();
});*/
// Checkbock click event
$($Grid.gridCheckboxes).click(function (e) {
console.log('checkbox clicked!');
e.stopPropagation();
var $t = $(this);
var checkboxID = $t.attr('id');
var thisRow = $t.closest('tr');
if ($t.is(':checked')) {
thisRow.addClass('k-state-selected');
// add to selected[]
if ($.inArray(checkboxID, $Grid.selectedRows) === -1) $Grid.selectedRows.push(checkboxID);
} else {
thisRow.removeClass('k-state-selected');
// remove from selected[]
$Grid.selectedRows.splice($.inArray(checkboxID, $Grid.selectedRows), 1);
}
});
}
$Grid.gridPersistSelected = function () {
$.each($Grid.selectedRows, function () {
var $t = $('#' + this);
if ($t) $t.click();
});
}
$Grid.pagerChange = function () {
$Grid.bindUIEvents();
$Grid.gridPersistSelected();
}
$Grid.refresh = function () {
$Grid.selectedRows = [];
$Grid.gridCheckboxes.attr('checked', false);
console.log('Refresh clicked.');
console.log('$Grid.selectedRows: '+$Grid.selectedRows);
}
// Init
$Grid.pagerChange();
// $Grid.pager.bind("change", $Grid.pagerChange);
// Unbind refresh button, then rebind
// Refresh button
$Grid.refreshButton.click(function(){
console.log('reset!');
$Grid.refresh();
});
$('.seeSelectedRowsArray').click(function(){
console.log($Grid.selectedRows);
});
return {
selectedRows: $Grid.selectedRows,
refresh: $Grid.refresh,
}
}
$(function(){
window.activeThreatsGrid = new KendoGridSelection('.grid', '.pager');
$('.seeSelectedRowsArray2').click(function(){
console.log(activeThreatsGrid.selectedRows);
});
});
HTML
<div class='grid'>
<div class='row'>
<label><input type="checkbox" id="item1"> </label>
</div>
<div class='row'>
<label><input type="checkbox" id="item2"> </label>
</div>
<div class='row'>
<label><input type="checkbox" id="item3"> </label>
</div>
<div class='row'>
<label><input type="checkbox" id="item4"> </label>
</div>
<div class='row'>
<label><input type="checkbox" id="item5"> </label>
</div>
<div class='pager'>
<input type="button" value="refresh" class="refreshButton">
</div>
<div><input type="button" value="seeSelectedRowsArray" class="seeSelectedRowsArray"></div>
<div><input type="button" value="seeSelectedRowsArray2" class="seeSelectedRowsArray2"></div>
</div>
CSS
.row{background:blue; height:20px; width:100px; margin-bottom:5px;}
JSFiddle
デモ
何が起こっている:
- 複数のチェックボックスをクリックしてから をクリックする
seeSelectedRowsArray
と、配列に正しい値が表示されます。ただし、これを何度も実行しても、正しい値を取得できます。 refresh
ボタンを押すと、console.log
配列selectedRows
が空であることがわかります。次に、をクリックするseeSelectedRowsArray
と、配列は空です(予想通り)。をクリックするseeSelectedRowsArray2
と、配列にはまだ値が含まれています。
更新 1
私が見つけたのは$Grid.selectedRows
、クラス内からボタンクリックにバインドすると、更新後でも常に最新の値を取得することです。selectedRows
パブリックをクラス外のボタンクリックにバインドすると、refresh
ボタンがクリックされた後、selectedRows
更新されなくなり、更新の直前の値でスタックします。
内部でバインドされたボタンは正しい配列値を表示するのに、パブリック プロパティでクラスの外部にバインドされselectedRows
たボタンはボタンをクリックしても更新されないのrefresh
はなぜですか?
どんな助けでも大歓迎です!