Knockout Select/Unselect all and get the selected row values
我正在尝试使用敲除创建一个全选/取消全选并获取选择要保存的行的值。
我能够全选和取消全选工作,但不确定如何获取所选行的数据。
此外,如果选中一个行复选框,则每行复选框都会被选中或取消选中。如果我取消选中一个复选框,我希望取消选中全选复选框。
到目前为止,我已经做了一个小提琴 http://jsfiddle.net/adriandcosta/ewprL5bd/4/
这是我的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Results <table width="100%" id="tblSearchResults" data-bind="visible: SearchResults().length>0"> <thead> <tr> <th align="left">Name</th> <th>Gender</th> <th align="left">DOB</th> <th align="left">Join Date</th> <th style="width:26px"> <input type="checkbox" data-bind="checked: allSelected" /> </th> </tr> </thead> <tbody id="EmpResults" data-bind="template: { name:'TmplSearchResults', foreach: SearchResults }"></tbody> </table> |
模板
1 2 3 4 5 6 7 8 9 10 | <script type="text/html" id="TmplSearchResults"> <tr style ="border-bottom: 1px solid #CCC;"> <td valign ="middle" data-bind="text: name"> </td> <td valign="middle" align="center" data-bind="text: gender"></td > <td valign ="middle" data-bind ="text: dob"></td> <td valign="middle" data-bind="text: joindate"></td > <td valign ="middle"> <input type ="checkbox" data-bind ="checked:$parent.isSelected"> </td> </tr> |
查看模型和数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | var vmSearchResult; var vmSearchResultsModel = function () { var self = this; self.showResults = ko.observable(false); self.SearchResults = ko.observableArray([]); self.isSelected = ko.observable(false); // check box self.allSelected = ko.observable(false); // all select checkbox self.allSelected.subscribe(function (newValue) { ko.utils.arrayForEach(vmSearchResult.SearchResults(), function (PartnerSearch) { vmSearchResult.isSelected(newValue); //<== here I get the selected values need the whole row }); }); } function ShowData() { vmSearchResult.SearchResults(fakeData); vmSearchResult.showResults(true); } $(document).ready(function () { vmSearchResult = new vmSearchResultsModel(); ko.applyBindings(vmSearchResult, document.getElementById("results")); ShowData(); }); //Fake data var fakeData = [{ "name":"Adrian D'Costa", "dob":"25-10-1984", "gender":"M", "joindate":"30-12-2004" }, { "name":"Janet D'Curz", "dob":"30-08-1992", "gender":"F", "joindate":"15-12-2005" }]; |
你会想要为 allSelected 属性使用 Writable 计算 observable 而不是普通的 observable。
当写入计算的 observable 时,您现在可以管理每一行的选定状态。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 | self.allSelected = ko.computed({ read: function () { var firstUnchecked = ko.utils.arrayFirst(self.searchResults(), function (item) { return item.isSelected() == false; }); return firstUnchecked == null; }, write: function (value) { ko.utils.arrayForEach(self.searchResults(), function (item) { item.isSelected(value); }); } }).extend({ rateLimit: 1 }); |
使用这种方法,您将不再需要订阅 allSelected 的更改。
当项目列表增长到任何显着大小时,需要使用 rateLimit 扩展器来避免性能下降。 rateLimit 扩展器是在 KO 3.1 中添加的,您的小提琴引用的是 2.3。我提供的小提琴使用的是 3.2.
仅供参考,这种方法假定您在每一行上都有一个 isSelected 可观察属性。你的例子中没有这个。在随附的小提琴中,您可以看到我是如何添加的。
小提琴
性能小提琴:
- 1000 个带有 rateLimit 的项目
- 1000 个项目没有 rateLimit