57

我找不到可以帮助我在 Angular 中解决这个简单问题的方法。当与位置路径进行比较时,所有答案都与导航栏相关。

我已经使用 list 和ngRepeat. 当我单击一行时,我试图为该行分配一个选定的 CSS 类,以突出显示该行已被用户选择的事实,并.selected从先前突出显示的行中删除该行。

我缺少在所选行和 css 类分配之间进行绑定的方法。

我应用了每个row( ul)ng-click="setSelected()" 但我缺少function应用更改的逻辑。

我的代码 - 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;
}
4

3 回答 3

134

每行都有一个 ID。您所要做的就是将此 ID 发送到函数setSelected(),将其存储($scope.idSelectedVote例如),然后检查每一行,如果所选 ID 与当前 ID 相同。这是一个解决方案(如果需要,请参阅文档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

于 2013-10-12T09:00:13.000 回答
6

您可能希望 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

于 2013-10-12T09:01:28.697 回答
3

我需要类似的东西,能够点击一组图标来表示一个选择,或者一个基于文本的选择,并用表示的值更新模型(2路绑定),还需要一种方法来指示哪个是肉眼选择的。我为它创建了一个 AngularJS 指令,因为它需要足够灵活以处理任何被单击以指示选择的 HTML 元素。

<ul ng-repeat="vote in votes" ...>
    <li data-choice="selected" data-value="vote.id">...</li>
</ul>

解决方案:http: //jsfiddle.net/brandonmilleraz/5fr9V/

于 2014-08-02T23:03:18.833 回答