2017-12-22 6 views
1

情報の結果を返すJSONデータを持つプロジェクトを作成しています。基本的には、カテゴリによってフィルタリングされるBootStrapタブを使用してこれらのデータを表示することです。AngularJS NG-repeat:ユニークな値をフィルタリングするng-repeat内のデータを繰り返す方法

モックJSONデータ:

"result": [ 
    { 
     category: "A", 
     price: "499.00", 
     productName: "AAA", 
     productConfig: { 
      specs: "Lorem ipsum", 
      creditAllowed: false, 
      description: "blah blah", 
      ... 
     } 
    }, 
    { 
     category: "A", 
     price: "479.00", 
     productName: "AAB", 
     productConfig: { 
      specs: "Lorem ipsum", 
      creditAllowed: true, 
      description: "blah blah", 
      ... 
     } 
    }, 
    { 
     category: "B", 
     price: "1299.00", 
     productName: "BBB", 
     productConfig: { 
      specs: "Lorem ipsum", 
      creditAllowed: true, 
      description: "blah blah", 
      ... 
     } 
    }, 
    { 
     category: "A", 
     price: "359.00", 
     productName: "AXX", 
     productConfig: { 
      specs: "Lorem ipsum", 
      creditAllowed: true, 
      description: "blah blah", 
      ... 
     } 
    }, 
] 

そのデータを考えます。私は必然的に、ng-repeatを使ってこれらのデータをすべてbootstrapタブに表示する必要があります。

私はこのような何かをしたい:

enter image description here

マークアップは次のようになります。

<a load-data data-param="1">Load me</a> 

ディレクティブは、サービスを呼び出して、すべてのデータが範囲内にあります。

<ul class="nav nav-tabs col-lg-4 col-md-4" role="tablist"> 
    <li ng-repeat="data in tableData | unique: 'category'"><a href="#{{$index}}" role="tab" toggle="tab"></li> 
</ul> 


... 

<div class="tab-content col-lg-8 col-md-8"> 
    <div role="tabpanel" class="tab-pane fade" id="{{$index}}" ng-repeat="contents in tableData | unique: 'category'"> 
     <h1>{{ contents.category }}</h1> 
     <div class="tab-content-details"> 
      <table class="table"> 
       <tr> 
        <td>{{ contents.price }}</td> 
        <td>{{ contents.productConfig.specs }}</td> 
        <td>{{ contents.productConfig.description }}</td> 
       </tr> 
      </table> 
     </div> 
    </div> 
</div> 

をしかし、現在のコードは次のようになり、私に結果を与える:今、要素はこれを持っている

enter image description here

各カテゴリには1 nav-linkと1 tab-paneに相当します。カテゴリに複数の商品がある場合は、<table>ng-repeatに、tab-paneには表示されません。ここで

ソートの理想的なマークアップ結果の目標を達成するために、次のとおりです。

<ul class="nav nav-tabs col-lg-4 col-md-4" role="tablist"> 
    <li class="active"><a href="#0" role="tab" toggle="tab">Category A</li> 
    <li><a href="#1" role="tab" toggle="tab">Category B</li> 
    ... 
</ul> 


... 

<div class="tab-content col-lg-8 col-md-8"> 
    <div role="tabpanel" class="tab-pane fade active" id="0"> 
     <h1>Category A</h1> 
     <div class="tab-content-details"> 
      <table class="table"> 
       <tr> 
        <td>499.00</td> 
        <td>Lorem ipsum</td> 
        <td>blah blah</td> 
       </tr> 
       <tr> 
        <td>479.00</td> 
        <td>Lorem ipsum</td> 
        <td>blah blah</td> 
       </tr> 
      </table> 
     </div> 
    </div> 
    <div role="tabpanel" class="tab-pane fade" id="1"> 
     <h1>Category B</h1> 
     <div class="tab-content-details"> 
      <table class="table"> 
       <tr> 
        <td>1299.00</td> 
        <td>Lorem ipsum</td> 
        <td>blah blah</td> 
       </tr> 
      </table> 
     </div> 
    </div> 
</div> 

は、私は、データの現在の構造で、私が欲しいの結果を得ることができます方法はありますか?皆さんありがとう!

+0

あなたはユニークなカテゴリを見つけて、そのカテゴリ内で繰り返さカテゴリをプッシュする必要があり、すべての最初のようなあなたのJSONオブジェクトを再構築する必要があります。この方法で、必要なものを簡単に達成することができます。 – Dixit

+0

hrefをカテゴリに変更し、配列要素をカテゴリ別にグループ化し、idをカテゴリ別にidにするのはなぜですか? – ChiefTwoPencils

+0

また、配列自体をカテゴリ別にフィルタリングし、フィルタリングされた配列をカテゴリにマップするオブジェクトを作成し、マップの(キー、値)ペアを使用するリピートにすべてをラップすることもできます。 – ChiefTwoPencils

答えて

1

あなたはid年代としてタブをターゲットとすべき、とあなたがdata.category、ない$indexと同じidを持つように各タブを設定することができまず。

<ul class="nav nav-tabs col-lg-4 col-md-4" role="tablist"> 
    <li ng-repeat="data in tableData | unique: 'category'"> 
    <a href="#{{data.category}}" role="tab" data-toggle="tab"> 
     Category {{ data.category }}   
    </a> 
    </li> 
</ul> 

その後、あなたは上記と同じ独特の繰り返しの上に、ネストされたng-repeatを使用して、ネストされたcontentカテゴリと全体的なdataカテゴリを比較するng-ifを使用することができます。toggleは、それ以外の場合は、ブートストラップタブで作業することはありません、data-toggleする必要があります:

<div class="tab-content col-lg-8 col-md-8"> 
    <div role="tabpanel" ng-repeat="data in tableData | unique: 'category'" class="tab-pane" id="{{data.category}}"> 
    <div ng-repeat="content in tableData"> 
     <div ng-if="content.category === data.category"> 
     {{ content | json }} 
     <hr> 
     </div>  
    </div> 
    </div> 
</div> 

これで、各項目を必要に応じてスタイルできます。私はJSONをレンダリングします。

デモ - >http://plnkr.co/edit/ZtZRA2im8Wxr1TaNWfkt?p=preview

+0

これは動作します!ありがとうdavidkonrad! – alleycat

+0

@alleycat、よろしいですか? upvotingをありがとう!私はplunkrでアクティブなタブを設定するのを忘れましたが、これは小さな問題だと思います。 – davidkonrad

0

var app = angular.module("App", []); 
 
       app.controller('AppCtrl',function($scope){ 
 
         $scope.json_data ={ 
 
         "result": [ 
 
    { 
 
     category: "A", 
 
     price: "499.00", 
 
     productName: "AAA", 
 
     productConfig: { 
 
      specs: "Lorem ipsum", 
 
      creditAllowed: false, 
 
      description: "blah blah", 
 
     } 
 
    }, 
 
    { 
 
     category: "A", 
 
     price: "479.00", 
 
     productName: "AAB", 
 
     productConfig: { 
 
      specs: "Lorem ipsum", 
 
      creditAllowed: true, 
 
      description: "blah blah", 
 
     } 
 
    }, 
 
    { 
 
     category: "B", 
 
     price: "1299.00", 
 
     productName: "BBB", 
 
     productConfig: { 
 
      specs: "Lorem ipsum", 
 
      creditAllowed: true, 
 
      description: "blah blah", 
 
     } 
 
    }, 
 
    { 
 
     category: "A", 
 
     price: "359.00", 
 
     productName: "AXX", 
 
     productConfig: { 
 
      specs: "Lorem ipsum", 
 
      creditAllowed: true, 
 
      description: "blah blah", 
 
     } 
 
    }, 
 
] 
 
}    
 
       $scope.tableData_obj = {} 
 
       $scope.filterTxn  = {} 
 
       $scope.json_data['result'].forEach(function(val){ 
 
           if(val['category'] in $scope.tableData_obj) 
 
             return; 
 
           else 
 
             $scope.tableData_obj[val['category']] = true; 
 
       }) 
 
       $scope.tableData  = Object.keys($scope.tableData_obj)  
 
       $scope.own_filter  = function(values){ 
 
         if(! $scope.filterTxn['values']) 
 
           return true; 
 
         if(values['category'] == $scope.filterTxn['values']) 
 
           return true 
 
         else 
 
           return false; 
 
       } 
 
       $scope.update_filterTxn_values = function(data){ 
 
         $scope.filterTxn['values'] = data; 
 
       } 
 
     })
li.ACTIVE{ 
 
         background:green; 
 
        
 
       } 
 
       li{ 
 
         list-style-type:none; 
 
       } 
 
       li a{ 
 
         cursor:pointer; 
 
       } 
 
           li.ACTIVE a { 
 
             color:white; 
 
             font-weight:700; 
 
           }
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="App" ng-controller="AppCtrl "> 
 
       <ul class="nav nav-tabs col-lg-4 col-md-4" role="tablist"> 
 
         <li ng-repeat="data in tableData track by $index" ng-class="{'ACTIVE':filterTxn['values'] == data}"><a ng-click="update_filterTxn_values(data)" role="tab" toggle="tab">{{'click_here to filter_data - '+data}}</a></li> 
 

 
       </ul> 
 
       <h1>{{'Selected Category - '+filterTxn['values']}}</h1> 
 
       <div class="tab-content col-lg-8 col-md-8"> 
 
        <div role="tabpanel" class="tab-pane fade" id="{{$index}}" ng-repeat="contents in json_data['result'] |filter:own_filter track by $index"> 
 
         <h1>{{ contents.category }}</h1> 
 
         <div class="tab-content-details"> 
 
          <table class="table"> 
 
           <tr> 
 
            <td>{{ contents.price }}</td> 
 
            <td>{{ contents.productConfig.specs }}</td> 
 
            <td>{{ contents.productConfig.description }}</td> 
 
           </tr> 
 
          </table> 
 
         </div> 
 
        </div> 
 
       </div> 
 

 
     </div>

+0

ありがとうSudhakar!これはほぼ完了ですが、主な問題はまだ解決されていません。内容をフィルタリングしていますが、それぞれのタブペインは1つずつ表示され、すべてが1つで表示されるべきではありません。 上記のコードはカテゴリAのすべてのタブペインを表示していますが、各カテゴリのタブペインである必要があります。

だけがすべてのデータに対して別々の 'ng-repeat'を持っています前記カテゴリー。ありがとう! – alleycat

関連する問題