2014-03-06 115 views
1

當我一次選擇兩個選擇按鈕時,我遇到了顯示和隱藏行的問題。如何使用多個選擇按鈕顯示和隱藏行

使用只有一個按鈕,我可以顯示/隱藏正確的行。 一次使用這兩個按鈕,不會顯示任何行。

代碼中的邏輯錯誤在哪裏?

請檢查: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> 
+0

確定。我有一個簡單的(!)解決方案。 http://jsfiddle.net/xEyJZ/85/ –

回答

0

您可以在過濾器中使用比較:

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/

+0

你的方法很乾淨,但是當兩個複選框都被選中時,列表消失。也許你可以嘗試解決這個問題。 – AlwaysALearner

+0

@ ng-User我當然可以! http://jsfiddle.net/dPgfu/1/ – Goodnickoff

+0

當兩個複選框都被選中時,只有新用戶和舊用戶應該可見。我的意思是隻有綠色和紅色的用戶,而不是黑色。 – AlwaysALearner

0

使用自定義過濾器:

<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

+0

完美。這就是我想要的。用show/hide來實現它非常複雜^^。非常感謝CodeHater –

+0

@ ng-User我的解決方案要短得多。沒有必要使用自定義過濾器。你可以使用comporator函數:http://jsfiddle.net/D79F7/2/。 – Goodnickoff

+0

@ ng-User我更喜歡使用'ng-show'的解決方案。無論如何,你可以更新你的問題,要求使用過濾器的解決方案。 – AlwaysALearner

0

你在你的布爾表達式有錯誤: 正確如下:

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

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

+0

謝謝。我找到了解決方案。但與此同時,我正在嘗試使用過濾器(包括兩個按鈕)「顯示」或「隱藏」來解決此問題。如果有人能幫助我,這將是非常棒的。 –

+0

@ ng-User這是帶濾波器的solutuion: http://jsfiddle.net/2cF2J/1/ – Goodnickoff

+0

謝謝Oledje。 不幸的是,我只能顯示一個組(無,新,舊)但我的目的是: 兩個按鈕選擇 - >顯示舊的,顯示新的,隱藏沒有//// 沒有選擇按鈕 - >顯示所有組。 –