Как выделить выделенную строку в ngRepeat?
Я не мог найти что-то, что поможет мне решить эту простую проблему
в Angular. Все ответы актуальны для навигационных полос при сравнении
выполняется против пути местоположения.
Я построил динамическую таблицу, используя список и ngRepeat
. Когда я нажимаю на строку, я пытаюсь присвоить этой строке выбранный класс css, чтобы подчеркнуть тот факт, что эта строка была выбрана пользователем, и удалите .selected
из ранее выделенной строки.
Мне не хватает метода привязки между выбранной строкой и назначением класса CSS.
Я применил каждый row
(ul
) ng-click="setSelected()"
Но мне не хватает логики внутри function
, чтобы применить изменения.
My Code - Plunk
Мой код:
var webApp = angular.module('webApp', []);
//controllers
webApp.controller ('VotesCtrl', function ($scope, Votes) {
$scope.votes = Votes;
$scope.statuses = ["Approved","Pending","Trash","Spam"];
$scope.setSelected = function() {
console.log("show");
}
});
//services
webApp.factory('Votes', [function() {
//temporary repository till integration with DB this will be translated into restful get query
var votes = [
{
id: '1',
created: 1381583344653,
updated: '222212',
ratingID: '3',
rate: 5,
ip: '198.168.0.0',
status: 'Pending',
},
{
id: '111',
created: 1381583344653,
updated: '222212',
ratingID: '4',
rate: 5,
ip: '198.168.0.1',
status: 'Spam'
},
{
id: '2',
created: 1382387322693,
updated: '222212',
ratingID: '3',
rate: 1,
ip: '198.168.0.2',
status: 'Approved'
},
{
id: '4',
created: 1382387322693,
updated: '222212',
ratingID: '3',
rate: 1,
ip: '198.168.0.3',
status: 'Spam'
}
];
return votes;
}]);
Мой HTML:
<body ng-controller='VotesCtrl'>
<div>
<ul>
<li class="created">
<a>CREATED</a>
</li>
<li class="ip">
<b>IP ADDRESS</b>
</li>
<li class="status">
<b>STATUS</b>
</li>
</ul>
<ul ng-repeat="vote in votes" ng-click="setSelected()">
<li class="created">
{{vote.created|date}}
</li>
<li class="ip">
{{vote.ip}}
</li>
<li class="status">
{{vote.status}}
</li>
</ul>
</div>
</body>
Мой CSS (только выбранный класс):
.selected {
background-color: red;
}
Ответы
Ответ 1
Каждая строка имеет идентификатор. Все, что вам нужно сделать, это отправить этот идентификатор функции setSelected()
, сохранить его (например, в $scope.idSelectedVote
), а затем проверить каждую строку, если выбранный идентификатор совпадает с текущим. Вот решение (см. документацию для ngClass
, если необходимо):
$scope.idSelectedVote = null;
$scope.setSelected = function (idSelectedVote) {
$scope.idSelectedVote = idSelectedVote;
};
<ul ng-repeat="vote in votes" ng-click="setSelected(vote.id)" ng-class="{selected: vote.id === idSelectedVote}">
...
</ul>
Plunker
Ответ 2
Вероятно, вы хотите, чтобы LI, а не UL, имел фоновый цвет:
.selected li {
background-color: red;
}
Затем вы хотите иметь динамический класс для UL:
<ul ng-repeat="vote in votes" ng-click="setSelected()" class="{{selected}}">
Теперь вам нужно обновить $scope.selected при нажатии строки:
$scope.setSelected = function() {
console.log("show", arguments, this);
this.selected = 'selected';
}
а затем отмените выделение ранее выделенной строки:
$scope.setSelected = function() {
// console.log("show", arguments, this);
if ($scope.lastSelected) {
$scope.lastSelected.selected = '';
}
this.selected = 'selected';
$scope.lastSelected = this;
}
Рабочее решение:
http://plnkr.co/edit/wq6nxc?p=preview
Ответ 3
Мне нужно было что-то похожее, возможность щелкнуть по набору значков, чтобы указать на выбор, или на основе текста, и обновить модель (двухстороннюю привязку) с представленным значением, а также способом для указания, который был выбран визуально. я создала для него директиву AngularJS, поскольку она должна была быть достаточно гибкой, чтобы обрабатывать любой элемент HTML, на который нужно щелкнуть, чтобы указать на выбор.
<ul ng-repeat="vote in votes" ...>
<li data-choice="selected" data-value="vote.id">...</li>
</ul>
Решение:
http://jsfiddle.net/brandonmilleraz/5fr9V/