【问题标题】:How to show and hide rows using several select buttons如何使用多个选择按钮显示和隐藏行
【发布时间】:2014-04-08 20:06:00
【问题描述】:

当我一次选择两个选择按钮时,我无法显示和隐藏行。

仅使用一个按钮,我就可以显示/隐藏正确的行。 同时使用这两个按钮,不会显示任何行。

代码中的逻辑错误在哪里?

请查看:http://jsfiddle.net/xEyJZ/83/

<div ng-controller="MyCtrl">
  <p>  
<input type="checkbox" ng-init="showNew=false" ng-click="showNew =! showNew"><span> Show new only</span> <br>   
<input type="checkbox" ng-init="showOld=false" ng-click="showOld =! showOld"><span> Show old only </span> 
    </p>

    <table border="1">
        <tr ng-repeat="person in persons" ng-class="{'newp':person.newp, 'oldp':person.oldp}" 
            ng-hide="(!person.newp && showNew) || (!person.oldp && showOld)">

            <td>{{ person.id }}</td>
            <td>{{ person.name }}</td>
            <td>{{ person.city }}</td>
        </tr>
    </table>


</div>

【问题讨论】:

标签: javascript angularjs filtering


【解决方案1】:

您可以在过滤器中使用比较器:

ng-repeat="person in persons | filter:{newp:showNew, oldp:showOld}:showTest"

和在控制器中设置比较函数:

$scope.showTest = function(actual, expected){
        if(!$scope.showNew && !$scope.showOld)
            return true;
        return angular.equals(expected, actual);
}

http://jsfiddle.net/D79F7/2/

【讨论】:

  • 你的方法很干净,但是当两个复选框都被选中时,列表就会消失。也许你可以尝试解决这个问题。
  • 当两个复选框都被选中时,应该只有新老用户可见。我的意思是只有绿色和红色的用户,而不是黑色的用户。
  • @ng-User 是的,你说得对。在这种情况下,比较器没用,但它可以实现更短的函数:ng-repeat="person in persons | filter:showTest"$scope.showTest = function(item){ if(!$scope.showNew &amp;&amp; !$scope.showOld) return true; if($scope.showNew &amp;&amp; $scope.showOld) return item.newp || item.oldp; return ($scope.showNew &amp;&amp; item.newp) || ($scope.showOld &amp;&amp; item.oldp); } jsfiddle.net/sH9RJ/2
【解决方案2】:

您的布尔表达式有错误: 正确如下:

ng-hide="(!person.newp &amp;&amp; showNew ) || (!person.oldp &amp;&amp; showOld)"

http://jsfiddle.net/ZWy93/2/

【讨论】:

  • 谢谢。我找到了解决方案。但与此同时,我试图用过滤器(包括两个按钮)而不是“显示”或“隐藏”来解决它。如果有人可以帮助我,那就太好了。
  • 谢谢奥莱杰。不幸的是,我只能显示一个组(无、新、旧)但我的目的是:两个按钮都被选中 --> 显示旧的、显示新的、不隐藏 //// 没有选择按钮 --> 显示所有组。跨度>
【解决方案3】:

使用自定义过滤器:

<input type="checkbox" ng-model="showNew">..Show new only..
<input type="checkbox" ng-model="showOld">..Show old only..
..        
<tr ng-repeat="person in persons | personsFilter : showNew : showOld" ..>

JS

myApp.filter("personsFilter",function(){
    return function(input, showNew, showOld){        
        if(!showNew && !showOld){
            return input;
        }
        else if(showNew && !showOld){
            var temp = [];
            for(var i = 0; i < input.length; i++){
                if(input[i].newp && !input[i].oldp)
                    temp.push(input[i]);                
            }
            return temp;
        }
        else if(showOld && !showNew){
            var temp = [];
            for(var i = 0; i < input.length; i++){
                if(input[i].oldp && !input[i].newp)
                    temp.push(input[i]);                
            }
            return temp;
        }
        else if(showOld && showNew){
            var temp = [];
            for(var i = 0; i < input.length; i++){
                if(input[i].oldp || input[i].newp)
                    temp.push(input[i]);                
            }
            return temp;
        }
    }
});

Fiddle

【讨论】:

  • 完美。这就是我想要的。用显示/隐藏来实现它非常复杂^^。非常感谢 CodeHater
  • @ng-User 我的解决方案要短得多。无需使用自定义过滤器。您可以使用比较器功能:jsfiddle.net/D79F7/2.
  • @ng-User 我更喜欢使用ng-show 的解决方案。无论如何,您可以使用过滤器更新您的问题以寻求解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多