AngularJS NG-repeat:如何重复必须过滤唯一值的ng-repeat内的数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AngularJS NG-repeat:如何重复必须过滤唯一值的ng-repeat内的数据相关的知识,希望对你有一定的参考价值。
我正在开发一个具有返回信息结果的JSON数据的项目。基本上,我们的想法是使用BootStrap选项卡显示这些数据,其中按类别进行过滤。
模拟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选项卡中显示所有这些数据。
我想要这样的东西:
标记看起来像这样:
<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>
但是当前代码给我的结果如下:
每个类别相当于一个nav-link
和一个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>
有没有办法可以用当前的数据结构实现我想要的结果?谢谢大家!
首先,你应该将标签定位为id
,你可以设置每个标签与id
具有相同的data.category
,而不是$index
; toggle
应该是data-toggle
,否则它永远不会与引导标签一起使用:
<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
,并使用ng-if
来比较整个data
类别和嵌套的content
类别:
<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。
但是ー> z zxswい
http://plnkr.co/edit/ZtZRA2im8Wxr1TaNWfkt?p=preview
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;
}
以上是关于AngularJS NG-repeat:如何重复必须过滤唯一值的ng-repeat内的数据的主要内容,如果未能解决你的问题,请参考以下文章
AngularJS - 在 ng-repeat 中设置默认值 [重复]
如果输入数组值是整数类型,为啥 angularjs(ng-repeat) 允许在第一次添加重复记录
如何在AngularJS中使用ng-repeat创建嵌套结构[关闭]
AngularJS ng-repeat 水平到垂直的重复项目
如何使用 ng-repeat 重复的 J Query 将表行附加到表得到错误 $compile not found |Angular js