简体   繁体   English

ngTable选择所有过滤的数据

[英]ngTable select all filtered data

I'm trying to select only the rows from an ng-table with filtered data. 我试图只选择带有过滤数据的ng表中的行。 Using the following code filters the table rows but even the rows that aren't shown are being selected: 使用以下代码过滤表行,但是甚至选择了未显示的行:

controller: 控制器:

let sampleData = [{id: 1, name: 'John Doe', gender: 'Male'},
    {id: 2, name: 'Jane Doe', gender: 'Female'},
    {id: 3, name: 'Mary Jane', gender: 'Female'},
    {id: 4, name: 'Mary Poppins', gender: 'Female'}];

$scope.tableParams = new NgTableParams({

}, {
    dataset: sampleData
});

$scope.checkboxes = {
    checked: false,
    items: {}
};

$scope.$watch(() => {
    return $scope.checkboxes.checked;
}, (value) => {
    sampleData.map((item) => {
        $scope.checkboxes.items.id = value;
    });
});

$scope.$watch(() => {
    return $scope.checkboxes.items;
}, () => {
    let checked = 0;
    let unchecked = 0;
    let total = sampleData.length;

    sampleData.map((item) => {
        if ($scope.checkboxes.items.id) {
            checked++;
        } else {
            unchecked++;
        }
    });

    if (unchecked === 0 || checked === 0) {
        $scope.checkboxes.checked = checked === total;
    }

    angular.element($element[0].getElementsByClassName('select-all')).prop('indeterminate', (checked != 0 && unchecked != 0));
});

html: HTML:

<script type="text/ng-template" id="checkbox.html">
    <input type="checkbox" ng-model="checkboxes.checked" class="select-all" value="">
</script>
<table class="table" ng-table="tableParams" show-filter="true">
    <tr ng-repeat="item in $data track by $index">
        <td header="'checkbox.html'">
            <input type="checkbox" ng-model="checkboxes.items[item.id]">
        </td>
        <td data-title="'Name'" filter="{'name': 'text'}">
            {{item.name}}
        </td>
        <td data-title="'Gender'" filter="{'gender': 'text'}">
            {{item.gender}}
        </td>
    </tr>
</table>

When the table is filtered via name or gender, the table rerenders with the filtered data. 当表格通过名称或性别进行过滤时,表格将使用过滤后的数据重新呈现。 When you click on the select all checkbox while the table is filtered, the filtered rows are selected. 在筛选表时单击“全选”复选框时,将选择筛选的行。 Unfortunately, when you clear the filter, the previously filtered out rows are also selected. 不幸的是,当您清除过滤器时,也会选择先前过滤掉的行。 The same is true when selecting all the filtered rows and then triggering an action that's supposed to get the selected items. 选择所有已过滤的行然后触发应该获取所选项的操作时也是如此。 (All ids are selected for the action.) (为操作选择了所有ID。)

How can I only select the filtered rows? 我怎样才能选择过滤的行? Thank you. 谢谢。

Okay, I got it to work. 好的,我得到了它的工作。 I just added a tableData object to the $scope so I can store the filtered data there. 我刚刚将一个tableData对象添加到$scope因此我可以将过滤后的数据存储在那里。 That's what I used for checking the selected items. 这就是我用来检查所选项目的内容。

let sampleData = [{id: 1, name: 'John Doe', gender: 'Male'},
    {id: 2, name: 'Jane Doe', gender: 'Female'},
    {id: 3, name: 'Mary Jane', gender: 'Female'},
    {id: 4, name: 'Mary Poppins', gender: 'Female'}];

$scope.tableData = {
    filteredData: [],
    checkboxes: {
        checked: false,
        items: {}
    }
};

$scope.tableParams = new NgTableParams({
    page: 1,
    count: 10
}, {
    total: data.length;
    getData: ($defer, params) => {
        let filter = params.filter();
        let count = params.count();
        let page = params.page();
        let filteredData = filter ? $filter('filter')(data, filter) : data;

        params.total(filteredData.length);
        $scope.tableData.filteredData = filteredData;

        $defer.resolve(filteredData.slice((page - 1) * count, page * count));
    }
});

$scope.$watch(() => {
    return $scope.tableData.checkboxes.checked;
}, (value) => {
    $scope.tableData.filteredData.map((item) => {
        $scope.tableData.checkboxes.items[item].id = value;
    });
});

$scope.$watch(() => {
    return $scope.tableData.checkboxes.items;
}, () => {
    let checked = 0;
    let unchecked = 0;
    let data = $scope.tableData.filteredData;
    let total = data.length;
    let checkboxes = $scope.tableData.checkboxes;

    data.map((item) => {
        if (checkboxes.items[item].id) {
            checked++;
        } else {
            unchecked++;
        }
    });

    if (unchecked === 0 || checked === 0) {
        checkboxes.checked = checked === total;
    }

    angular.element($element[0].getElementsByClassName('select-all')).prop('indeterminate', (checked != 0 && unchecked != 0));
});

Not really sure if this is the best way to go about it. 不确定这是否是最佳方式。 Also, this doesn't change the select all checkbox's state to indeterminate when you filter > select all > clear filter. 此外,当您过滤>全选>清除过滤器时,这不会将select all复选框的状态更改为indeterminate

in your second watch, change to return $scope.tableData.filteredData; 在你的第二个手表中,更改为返回$ scope.tableData.filteredData; may solve your problem 可以解决你的问题

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM