Angular 数据表 - Select 仅过滤行
Angular Datatables - Select only filtered rows
我正在以 angular 方式呈现我的 DataTable
,我在每行添加了一个复选框,并在顶部添加了一个 select all
复选框。问题是,例如,如果我检查 select all
它会检查所有行,我会使用搜索框过滤行。我该怎么做才能在单击 select all
复选框时仅检查过滤后的可见行。
Html
<table id="tblAvailable" datatable="ng" dt-options="mainCtrl.dtOptions" dt-instance="mainCtrl.dtInstance" dt-column-defs="mainCtrl.dtColumnDefs" class="table table-responsive table-hover">
<thead>
<tr>
<th>Ref. #</th>
<th>Type</th>
<th>Category</th>
<th>Applied Amount</th>
<th>New Amount</th>
<th><input type="checkbox" ng-model="mainCtrl.selectAll" ng-click="mainCtrl.toggleAll(mainCtrl.selectAll)" ng-change="mainCtrl.update()"></th>
</tr>
</thead>
<tbody>
<tr ng-repeat="Item in mainCtrl.newLineDetails" ng-if="Item.Amount > 0">
<td>{{Item.Id}}</td>
<td>{{Item.Type.Name}}</td>
<td>{{Item.Category.Name}}</td>
<td>{{Item.Amount | number:2}}</td>
<td><input type="number" ng-disabled="Item.isSelected == false" id="Amount" name="Amount" class="form-control ng-pristine ng-untouched ng-valid ng-not-empty" ng-model="Item.Amount" ng-min="1" ng-max="Item.Amount" ng-required="Item.isSelected == true" ng-change="mainCtrl.updateForFreeUps()"/></td>
<td><input type="checkbox" ng-model="Item.isSelected" ng-change="mainCtrl.toggleOne(Item.Id)"></td>
</tr>
</tbody>
</table>
Ctrl
self.toggleAll = function(selectAll) {
angular.forEach(self.newLineDetails, function (value, index) {
self.newLineDetails[index]["isSelected"] = selectAll;
if (selectAll == false) {
self.newLineDetails[index]["Amount"] = null;
}
})
}
self.toggleOne = function (Id) {
for (var i = 0, len = self.newLineDetails.length; i < len; i++) {
if (self.newLineDetails[i]["Id"] == Id) {
self.newLineDetails[i]["Amount"] = null;
self.selectAll = false;
self.update();
return;
}
}
self.selectAll = true;
}
有很多方法可以解决这个问题:
1)您可以为select所有复选框编写更改功能。在该功能中,您应该先过滤所有数据,然后再检查它们。
2) 您可以将您的主要数据复制到另一个变量(我们现在称之为 x)。之后在 table 中显示 x(不是您的主要资源)。当您想使用搜索框过滤主要数据过滤行并将其传递到 x 变量中时当您想要使用它进行检查或添加等时使用 x 变量
您必须 浏览数据表API。 DT 从 "shadow table" 中删除并注入 DOM 节点,因此仅操纵 DOM 只会产生明显的(不是真实的)效果,直到下一次重绘。幸运的是,您已经实现了 dtInstance
。
从 1.10.6 开始,遍历行、列或单元格的最方便的方法是 every
方法。看到这个 plunkr -> http://plnkr.co/edit/NOP5u4PUcwVOBFUtBkBi?p=preview
$scope.$watch('settings.selectAll', function(newVal, oldVal) {
if (newVal == oldVal) return
var api = $scope.dtInstance.DataTable;
api.rows({ search:'applied' }).every(function() {
api.cell({ row:this.index(), column:0 })
.nodes()
.to$()
.find('input')
.prop('checked', $scope.settings.selectAll);
})
$scope.dtInstance.DataTable.draw()
})
此处复选框位于第 0 列;代码可以翻译成
- 循环遍历所有行
- 获取第一列
- 转换为 jQuery 实例
- 找到
<input>
- 更新
checked
状态
关于您的 selectAll
复选框的一些注意事项:
- 最好将对象用作
ng-model
,在示例中我使用了 settings.selectAll
文字
ng-click
不能有效地使用复选框,如果你真的想使用指令,只使用 ng-change
- 因为你使用的是
ng-model
,你可以直接$watch
那个值,调用mainCtrl.toggleAll(mainCtrl.selectAll)
就是"obscure"
我正在以 angular 方式呈现我的 DataTable
,我在每行添加了一个复选框,并在顶部添加了一个 select all
复选框。问题是,例如,如果我检查 select all
它会检查所有行,我会使用搜索框过滤行。我该怎么做才能在单击 select all
复选框时仅检查过滤后的可见行。
Html
<table id="tblAvailable" datatable="ng" dt-options="mainCtrl.dtOptions" dt-instance="mainCtrl.dtInstance" dt-column-defs="mainCtrl.dtColumnDefs" class="table table-responsive table-hover">
<thead>
<tr>
<th>Ref. #</th>
<th>Type</th>
<th>Category</th>
<th>Applied Amount</th>
<th>New Amount</th>
<th><input type="checkbox" ng-model="mainCtrl.selectAll" ng-click="mainCtrl.toggleAll(mainCtrl.selectAll)" ng-change="mainCtrl.update()"></th>
</tr>
</thead>
<tbody>
<tr ng-repeat="Item in mainCtrl.newLineDetails" ng-if="Item.Amount > 0">
<td>{{Item.Id}}</td>
<td>{{Item.Type.Name}}</td>
<td>{{Item.Category.Name}}</td>
<td>{{Item.Amount | number:2}}</td>
<td><input type="number" ng-disabled="Item.isSelected == false" id="Amount" name="Amount" class="form-control ng-pristine ng-untouched ng-valid ng-not-empty" ng-model="Item.Amount" ng-min="1" ng-max="Item.Amount" ng-required="Item.isSelected == true" ng-change="mainCtrl.updateForFreeUps()"/></td>
<td><input type="checkbox" ng-model="Item.isSelected" ng-change="mainCtrl.toggleOne(Item.Id)"></td>
</tr>
</tbody>
</table>
Ctrl
self.toggleAll = function(selectAll) {
angular.forEach(self.newLineDetails, function (value, index) {
self.newLineDetails[index]["isSelected"] = selectAll;
if (selectAll == false) {
self.newLineDetails[index]["Amount"] = null;
}
})
}
self.toggleOne = function (Id) {
for (var i = 0, len = self.newLineDetails.length; i < len; i++) {
if (self.newLineDetails[i]["Id"] == Id) {
self.newLineDetails[i]["Amount"] = null;
self.selectAll = false;
self.update();
return;
}
}
self.selectAll = true;
}
有很多方法可以解决这个问题: 1)您可以为select所有复选框编写更改功能。在该功能中,您应该先过滤所有数据,然后再检查它们。 2) 您可以将您的主要数据复制到另一个变量(我们现在称之为 x)。之后在 table 中显示 x(不是您的主要资源)。当您想使用搜索框过滤主要数据过滤行并将其传递到 x 变量中时当您想要使用它进行检查或添加等时使用 x 变量
您必须 浏览数据表API。 DT 从 "shadow table" 中删除并注入 DOM 节点,因此仅操纵 DOM 只会产生明显的(不是真实的)效果,直到下一次重绘。幸运的是,您已经实现了 dtInstance
。
从 1.10.6 开始,遍历行、列或单元格的最方便的方法是 every
方法。看到这个 plunkr -> http://plnkr.co/edit/NOP5u4PUcwVOBFUtBkBi?p=preview
$scope.$watch('settings.selectAll', function(newVal, oldVal) {
if (newVal == oldVal) return
var api = $scope.dtInstance.DataTable;
api.rows({ search:'applied' }).every(function() {
api.cell({ row:this.index(), column:0 })
.nodes()
.to$()
.find('input')
.prop('checked', $scope.settings.selectAll);
})
$scope.dtInstance.DataTable.draw()
})
此处复选框位于第 0 列;代码可以翻译成
- 循环遍历所有行
- 获取第一列
- 转换为 jQuery 实例
- 找到
<input>
- 更新
checked
状态
关于您的 selectAll
复选框的一些注意事项:
- 最好将对象用作
ng-model
,在示例中我使用了settings.selectAll
文字 ng-click
不能有效地使用复选框,如果你真的想使用指令,只使用ng-change
- 因为你使用的是
ng-model
,你可以直接$watch
那个值,调用mainCtrl.toggleAll(mainCtrl.selectAll)
就是"obscure"