【问题标题】:ng-repeat for various json object with different valuesng-repeat 用于具有不同值的各种 json 对象
【发布时间】:2016-04-18 18:36:52
【问题描述】:

这就是问题所在。我有这个开发不佳的 json 文件,其中每个区域有 3 个不同的对象。这是一个例子。

{
    "gebieden":"Antwerpen",
    "onderwerpen":"Gemiddeld netto inkomen per belastingsplichtige",
    "data_2005":"15084,8252887",
    "data_2006":"14935,2782929",
    "data_2007":"15353,0192747",
    "data_2008":"16040,981705",
    "data_2009":"16050,4881554",
    "data_2010":"15777,0232385",
    "data_2011":"16487,8501985"
},
{
    "gebieden":"Antwerpen",
    "onderwerpen":"Mediaan netto inkomen",
    "data_2005":"11424",
    "data_2006":"11194",
    "data_2007":"11445",
    "data_2008":"12208",
    "data_2009":"12316",
    "data_2010":"12211",
    "data_2011":"12788"
},
{
    "gebieden":"Antwerpen",
    "onderwerpen":"Aantal belastingsplichtigen",
    "data_2005":"129568",
    "data_2006":"137614",
    "data_2007":"141273",
    "data_2008":"142771",
    "data_2009":"146058",
    "data_2010":"151516",
    "data_2011":"151674"
}

注意这 3 个对象的属性 "gebieden" 具有相同的值,但属性 "onderwerpen" 的值不同 现在我已经成功地展示了一个手风琴组中的所有区域:

 <div class="panel-group" id="accordion">
                    <div class="panel panel-default" ng-repeat="item in All | unique:'gebieden'">
                        <div class="panel-heading text-center" data-toggle="collapse" data-parent="#accordion" id="{{item.gebieden}}" href="#{{$index}}">
                            <h4 class="panel-title">
                                {{item.gebieden}}
                            </h4>
                        </div>
                        <div id="{{$index}}" class="panel-collapse collapse ">
                            <div class="panel-body text-center">
                                <ul class="nav nav-tabs">
                                    <li ng-repeat="item in All | unique:'onderwerpen'">
                                        <a data-toggle="tab" href="#{{item.onderwerpen}}">
                                            {{item.onderwerpen}}
                                        </a>
                                    </li>
                                </ul>
                                <div class="tab-content" style="padding:2%">
                                    <div id="{{item.onderwerpen}}" class="tab-pane fade in active">
                                        <table class="table table-bordered text-center">
                                            <thead>
                                                <tr>
                                                    <th class="text-center">Jaar</th>
                                                    <th class="text-center">Waarde</th>
                                                </tr>
                                            </thead>
                                            <tbody>
                                                <tr ng-repeat="(key,val) in item | comparator" ng-hide="$index<2" >
                                                    <td>{{key}}</td>
                                                    <td>{{val}}</td>
                                                </tr>
                                            </tbody>
                                        </table>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>

如您所见,我已经为面板主体实现了一个选项卡布局,并设法为整个 JSON 中的每个值 "onderwerpen"there 创建了一个选项卡。但是我如何访问这些不同对象的数据,因为我使用uniquefilter 来避免显示双重数据。如何仅从具有属性值"onderwerpen" = chosen tabshow 的对象中获取数据? 我不确定我的问题是否足够清楚,如果不是,请随时告诉我并询问更多信息。 谢谢。

【问题讨论】:

  • 阅读that我认为你可以使用ng-if来过滤一些对象
  • 为什么不在您的项目上使用filter。作为通过的条件,您可以选择您选择的标签。
  • 我明白,我也想过,但我真的不知道该怎么做? ://
  • @ShyA 我已经调查过了,但我似乎找不到在我的情况下如何使用的结构?
  • @LordTribual 有没有机会告诉我如何对选定的onderwerpen 选项卡中的数据执行 ng-repeat ?

标签: javascript angularjs json twitter-bootstrap ng-repeat


【解决方案1】:

如 cmets 中所述,您可以使用filter 根据单击的选项卡过滤掉对象。这是一个工作小提琴,它根据单击的选项卡显示属性 - http://jsfiddle.net/uwpjk28w/12/

所以,基本上我添加了一个 ng-click 函数来更改 onderwerpen 属性。

<a data-toggle="tab" ng-click="setOnderwerpen(item.onderwerpen)">
     {{item.onderwerpen}}
</a>

改变onderwerpen的函数:

 $scope.selectedOnderwerpen = '';
 $scope.setOnderwerpen = function (onderwerpen) {
        $scope.selectedOnderwerpen = onderwerpen;
 }

还有过滤器:

<tbody ng-repeat="item in All | filter {onderwerpen:selectedOnderwerpen}:true">
      <tr ng-repeat="(key,value) in item" ng-show="$index < 7">
           <td>{{key}}</td>
           <td>{{value}}</td>
      </tr>
</tbody>

另外,使用 ng-show 仅当您选择了一个选项卡时才显示表格。

ng-show="selectedOnderwerpen!=''" 

希望这个答案有帮助。

【讨论】:

  • 哇,是的,这对我有帮助,非常感谢。现在我只想知道,是否可以像| filter {onderwerpen: {{parentscope.onderwerpen}}}:true 这样在过滤器中使用数据绑定,或者这不起作用?
  • 对于&lt;div class="tab-pane ..."&gt;,我尝试使用id="ond{{$index}}" 使ID 唯一,但这仅适用于第一次折叠,因此所有其他折叠都不起作用。我尝试使用父作用域中的$index,但这不起作用。对如何为这些标签创建自动唯一 ID 有任何想法吗?
  • 我将 JSON 的另一部分添加到您的小提琴中,您可以在此处看到:jsfiddle.net/Tom_EMK/uwpjk28w/15 它永远不会为第二个面板内容检索正确的数据(如果您理解我想说的话?)
  • 关于你的第二个问题,&lt;div class="tab-pane ..."&gt; 中ID 不唯一的原因是因为这个div 是根据唯一onderwerpen 的数量循环的,所以它只迭代了一次。要使其独一无二,请将&lt;div id="{{item.onderwerpen}}" 替换为&lt;div id="{{selectedOnderwerpen}}",这样每当您单击选项卡时,ID 都会根据选项卡的onderwerpen 值更新。这是更新的小提琴 - jsfiddle.net/uwpjk28w/20。希望这有意义并回答您的问题。如果没有,请告诉我。
  • 啊,是的,为了让第二个面板正确渲染数据,我像这样将过滤器链接在一起 - &lt;tbody ng-repeat="item in All | filter:{onderwerpen:selectedOnderwerpen}:true | filter:{gebieden:selectedGebieden}:true"&gt;。这是更新的小提琴 - jsfiddle.net/uwpjk28w/31。所以,每当你点击gebieden时,我都会重置onderwerpen并使用一个函数设置gebieden。另外,我仅在onderwerpengebieden 都设置为ng-show="selectedOnderwerpen!='' &amp;&amp; selectedGebieden!=''" 时才显示该表。希望这可以帮助 :)。如果没有,请告诉我。
【解决方案2】:

我认为你可以像这样修改 json:

{
   "gebieden":"Antwerpen",
   "onderwerpen":"Gemiddeld netto inkomen per belastingsplichtige",
   "data":{
      "data_2005":"15084,8252887",
      "data_2006":"14935,2782929",
      "data_2007":"15353,0192747",
      "data_2008":"16040,981705",
      "data_2009":"16050,4881554",
      "data_2010":"15777,0232385",
      "data_2011":"16487,8501985"
   }
},
{
   "gebieden":"Antwerpen",
   "onderwerpen":"Mediaan netto inkomen",
   "data":{
      "data_2005":"11424",
      "data_2006":"11194",
      "data_2007":"11445",
      "data_2008":"12208",
      "data_2009":"12316",
      "data_2010":"12211",
      "data_2011":"12788"
   }
},
{
   "gebieden":"Antwerpen",
   "onderwerpen":"Aantal belastingsplichtigen",
   "data":{
      "data_2005":"129568",
      "data_2006":"137614",
      "data_2007":"141273",
      "data_2008":"142771",
      "data_2009":"146058",
      "data_2010":"151516",
      "data_2011":"151674"
   }
}

你可以很好地获取数据:

<!DOCTYPE html>
<html ng-app="app">

  <head>
    <link rel="stylesheet" href="style.css">
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script>
    <script src="script.js"></script>
  </head>

  <body >
    <div class="panel-group" id="accordion" ng-controller="mainCtrl">
                    <div class="panel panel-default" ng-repeat="item in All">
                        <div class="panel-heading text-center" data-toggle="collapse" data-parent="#accordion" id="{{item.gebieden}}" href="#{{$index}}">
                            <h4 class="panel-title">
                                {{item.gebieden}}
                            </h4>
                        </div>
                        <div id="{{$index}}" class="panel-collapse collapse ">
                            <div class="panel-body text-center">
                                <ul class="nav nav-tabs">
                                    <li>
                                        <a data-toggle="tab" href="#{{item.onderwerpen}}">
                                            {{item.onderwerpen}}
                                        </a>
                                    </li>
                                </ul>
                                <div class="tab-content" style="padding:2%">
                                    <div id="{{item.onderwerpen}}" class="tab-pane fade in active">
                                        <table class="table table-bordered text-center">
                                            <thead>
                                                <tr>
                                                    <th class="text-center">Jaar</th>
                                                    <th class="text-center">Waarde</th>
                                                </tr>
                                            </thead>
                                            <tbody>
                                                <tr ng-repeat="(key,val) in item.data" ng-hide="$index<2" >
                                                    <td>{{key}}</td>
                                                    <td>{{val}}</td>
                                                </tr>
                                            </tbody>
                                        </table>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>

  </body>

</html>

plunker查看这个工作示例

【讨论】:

  • 我无法编辑 JSON,因为我使用 nodejs 从打开的数据集中解析它并将其传递给我的前端
猜你喜欢
  • 2017-09-13
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多