AngularJS dirPagination Выбрать все видимые строки

Я создаю проект управления данными CRUD, используя Angular и директиву dirPagination, и мне нужен флажок «выбрать все», который выбирает все строки, которые видны / без / с использованием jQuery.

Я начал с этого - обратите внимание - я поднимаюсь по кривой обучения Angular и знаю, что некоторые / все это может быть не «подходом Angular», но я также не хочу начинать возиться (без слов) с кишками dirPagination , следовательно, директива dirPagination:

 <tr dir-paginate-start="item in items|filter:filterFunction()|orderBy:sortPredicate:reverse| itemsPerPage: rowsPerPage">

и отдельная строка-флажок

<input type="checkbox" class="rowSelector" ng-model="item.isSelected"  ng-change="rowSelect($index, $event)"/> status: {{item.isSelected}}

и соответствующие элементы модели:

$scope.items = [] //subsequently filled
$scope.rowsPerPage = 5;
$scope.rowSelect = function (ix, $event) {
           var checked = (typeof $event == 'undefined') ? false : true;
           if (!checked) { $scope.masterCheck = false; }
           var rpp = $scope.rowsPerPage;
           var p = $scope.__default__currentPage;  //dirPagination's current page
           var start = ((Math.max(0, p - 1) * rpp));
           $scope.items[start + ix].isSelected = checked;
       };

это работает, как ожидалось. Установите / снимите флажок со строки, и значение {{item.isSelected}} обновится в модели и отобразится рядом с флажком.

Затем я добавил это / за / из блока повторения dirPagination:

<input type="checkbox" id="masterCheckbox" ng-model="masterCheck" ng-click="checkAll()" />

и связанная функция в модели:

 $scope.masterCheck = false;
 $scope.checkAll = function () {
           var rpp = $scope.rowsPerPage;
           var p = $scope.__default__currentPage;          //dirPagination's current page
           var start = ((Math.max(0, p - 1) * rpp));
           var checked = $scope.masterCheck == true;
           var rows = document.getElementsByClassName("rowSelector");
           for (var ix = 0; ix < rows.length; ix++) {
               rows[ix].checked = checked;
               $scope.items[start + ix].isSelected = checked;
           }
       }

однако в функции checkAll () проверка / снятие отметки с отдельных строк не отражается на отображении {{item.isSelected}} каждой строки.

Явная установка отдельного элемента с помощью

$scope.items[start + ix].isSelected = checked;

Кажется, что свойство isSelected этого элемента устанавливается в рамках функции checkAll, но отображение строки не изменяется.

Ясно, что у меня что-то не так, возможно, я неправильно понимаю проблему Scope, но на данный момент я в тупике.

Любая помощь очень ценится :-)


person Serexx    schedule 02.07.2015    source источник
comment
У меня есть решение этой проблемы в моем предыдущем посте введите здесь описание ссылки   -  person Prathap Kudupu    schedule 26.11.2015


Ответы (2)


Наконец-то забрезжил свет.

checkAll (), как написано, попытался получить доступ к каждой строке, вычислив ее позицию, используя dir-paginate __default__currentPage и Angular row $ index.

Конечно, это не сработает, потому что коллекция items [], хранящаяся в dir-paginate, была подвергнута фильтрации и сортировке, поэтому, хотя items [] действительно проверяется (item.isSelected = true), выбранные элементы / строки живут на не -видимые страницы. т.е. - мы выбирали неправильные индексы.

Одно решение состоит из следующего -

Флажок мастера

<input type="checkbox" id="masterCheckbox" ng-model="masterCheck" ng-click="checkAll()" />

Флажок строки (обратите внимание на вызовы функций)

<input type="checkbox" class="rowSelector" value="{{sourceIndex('senId',item.senId)}}" ng-model="item.isSelected" ng-click="rowSelect(this)" />

тег управления директивой dir-paginate

 <dir-pagination-controls on-page-change="onPageChange(newPageNumber)" max-size="15" direction-links="true" boundary-links="true" pagination-id="" template-url=""></dir-pagination-controls>

и соответствующие значения и функции $ scope:

       $scope.items = [];
       $scope.masterCheck = false;
       $scope.onPageChange = function (newPageNumber) {
           //clear all selections on page change
           //dir-paginate provides this hook
           $scope.masterCheck = false;
           for (var i in $scope.items) {
               $scope.items[i].isSelected = false;
           }
       }

       $scope.rowSelect = function (item) {
           //if one is unchecked have to turn master off
           if (!item.isSelected) $scope.masterCheck = false;
       }

       $scope.sourceIndex = function (keyName, key) {
           //gets the actual items index for the row key
           //see here http://stackoverflow.com/questions/21631127/find-the-array-index-of-an-object-with-a-specific-key-value-in-underscore
           //for the 'getIndexBy' prototype extension
           var ix = $scope.items.getIndexBy(keyName, key);
           return ix;

       }

       $scope.checkAll = function () {
           //only visible rows 
           var boxes = document.getElementsByClassName("rowSelector");
           for (var bix in boxes) {
               var ix = boxes[bix].value;
               $scope.items[ix].isSelected = $scope.masterCheck;
           }
       }

Вероятно, есть способ получше, но, хотя он и не очень эффективен, он работает достаточно хорошо для обычных людей.

Функция $ scope.sourceIndex () вставляет фактический индекс исходной строки в флажок строки как его значение = значение атрибута.

Затем функция checkAll () захватывает все видимые строки классом rowSelector, а затем выполняет итерацию по ним, захватывая индекс данных из значения флажка и устанавливая соответствующий item.isSelected.

$ Scope.onPageChange указывается в директиве dir-Paginate controls и гарантирует, что при изменении страницы все выбранные строки очищаются.

Счастливы счастливы.

person Serexx    schedule 04.07.2015

Для вашей переменной masterCheck устанавливается значение false в rowSelect (), а затем в checkAll () вы устанавливаете значение check для masterCheck, которое затем используется для назначения isSelected

Эта строка неверна:

var checked = $scope.masterCheck == true;

Потому что вы хотите перевернуть masterCheck, поэтому он должен быть:

$scope.masterCheck = !$scope.masterCheck;

а потом

.isSelected = $scope.masterCheck;

Вы никогда не устанавливали для $ scope.masterCheck значение true, поэтому оно всегда было ложным, и поскольку ваши значения isSelected зависели от него, они всегда были ложными. Кроме того, это работает как checkAll / unCheckAll, чтобы проверять только все изменения в следующем:

$scope.masterCheck = !$scope.masterCheck;
var checked = $scope.masterCheck == true;
person user3727843    schedule 02.07.2015
comment
Спасибо, но эта строка просто снимает флажок «Выбрать все», если какая-либо из отдельных строк не отмечена, что является правильным поведением. Проблема в том, что установка флажка Master в первую очередь не меняет отображение статуса отдельной строки. Я попытался удалить его из любопытства, но, к сожалению, без радости. - person Serexx; 02.07.2015
comment
Нет извинений в строке, которую вы смотрите. Var checked отражает состояние флажка masterCheck после щелчка. Все, что делает эта строка, - это определяет, какой она сейчас статус, после щелчка. Затем мы устанавливаем статус каждой строки, чтобы он соответствовал этому статусу, каким бы он ни был. Флажки строк устанавливаются правильно и отображаются правильно. - person Serexx; 02.07.2015