#angularjs #checkbox #count #smart-table
#angularjs #флажок #подсчет #смарт-таблица
Вопрос:
Мне трудно подсчитывать выбранные флажки в моем приложении. Я попытался ответить на некоторые другие вопросы о переполнении стека, но пока без кубиков … если у вас, ребята, есть опыт подсчета флажков, некоторая помощь была бы отличной.
HTML:
<div class="row">
<div class="col-md-12">
<table id="document-table" st-table="documents" st-safe-src="yourDisplayedCollection" class="table">
<div>Total checked: ({{selectedCounter}})</div>
<thead>
<tr>
<th>
<st-select-all all="yourDisplayedCollection"></st-select-all>
</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="document in documents">
<td><input type="checkbox" ng-model="document.isSelected"/></td>
</tr>
</tbody>
</table>
</div>
</div>
Контроллер:
.контроллер (‘DocumentsController’, /** @ngInject */ функция ($scope, restData, DateFormats, documents) {
$scope.dateFormat = dateFormats.angularDateFilter;
$scope.documents = documents.resultBag[0].documentBag;
$scope.yourDisplayedCollection = [].concat(documents.resultBag[0].documentBag);
$scope.selectAll = function (selected) {
var documents = $scope.documents;
angular.forEach(documents, function (documents) {
documents.selected = selected;
});
// Update the counter
if(selected){
$scope.selectedCounter = documents.length;
} else {
$scope.selectedCounter = 0;
}
};
Редактировать:
У меня есть флажок «установить все флажки» вверху, поэтому у меня есть yourDisplayedCollection в таблице, а также ng-model=»document.IsSelected»
Комментарии:
1. у вас есть несколько проблем… один из них является дочерней областью
ng-repeat
. Могут ли эти флажки быть привязаны к свойству каждого документа? Или они должны быть отдельными?2. Взгляните на мой ответ ниже. Вам нужно взглянуть на приведенный выше пример и переделать его, чтобы он имел больше смысла.
3. ngcoderscope.wordpress.com/2016/08/12/multi-checkbox-directive надеюсь , эта директива пригодится вам !
Ответ №1:
Вам нужно переработать пару вещей, если я правильно понимаю ожидаемый результат.
Первый (html):
<tr ng-repeat="document in documents">
//Bind your model directily to the selected property in your object (document)
<td><input type="checkbox" ng-model="document.selected"/></td>
</tr>
Второй:
$scope.selectAll = function (selected) {
var documents = $scope.documents;
angular.forEach(documents, function (doc) {
if(doc.selected)
$scope.selectedCounter =1;
});
};
Это даст вам правильный подсчет каждый раз. Хотя ваше имя функции вводит в заблуждение. selectAll должно означать буквально выбрать все. Для меня это похоже на то, что вы просто считаете.
Ответ №2:
Самый простой способ сделать это — использовать Array.prototype.filter()
и использовать длину отфильтрованного массива
<input type="checkbox" ng-model="document.selected"/>
И для счетчика:
$scope.selectedCounter = $scope.documents.filter(function(item){
return item.selected;
}).length;
Необходимо знать, что вы нарушаете золотое правило всегда использовать объект в ng-model
.
ng-repeat
создает дочернюю область, и когда вы используете примитив в дочерней области, родительский контроллер не может видеть его изменения
Комментарии:
1. создайте демо-версию plunker или другой изолированной среды