【问题标题】:AngularJS - Display complex JSON data with a single ng-repeatAngularJS - 使用单个 ng-repeat 显示复杂的 JSON 数据
【发布时间】:2017-06-12 16:39:57
【问题描述】:

我正在尝试展示某个系列的所有书籍。我使用了嵌套的 ng-repeat,效果很好。但是,由于最近布局要求的一些变化,我不能使用嵌套的 ng-repeat(我想要一个单一的书籍列表)。我希望像下面这样的东西

<ul>
    <li>book1 of series1</li>
    <li>book 2 of series 1</li>
    <li>book1 of series 2</li>
    <li>book2 of series 2</li> 
    <li>book1 of series 3</li>
    <li>book2 of series 3</li>
</ul>

有没有办法用 1 ng-repeat 做到这一点?还是用其他方法? (即数组)

数据

var data = {
    "records": [
        {
            "name": "Spectrum Series",
            "seriesid": "SpectrumSeries",
            "book": [
                {
                    "name": "White Curse",
                    "bookid": "WhiteCurse",
                    "image": "book1"                    
                },
                {
                    "name": "Blue Fox",
                    "bookid": "BlueFox",
                    "image": "book2"                   
                }
            ]
        }

… other series
 ]
};

控制器

$scope.serieslist = data.records;

HTML

    <div ng-repeat="series in serieslist">
        <ul ng-repeat="book in series.book">            
            <li>                  
                <div>{{series.name}}</div>
                <div>{{book.name}}</div>                    
            </li>            
        </ul>
    </div>

【问题讨论】:

  • 您希望结果如何?即
  • 请提供您想要的 HTML 结构(非嵌套)。如果我理解正确,您将需要使用 ng-repeat-startng-repeat-end 来获得 flat HTML 结构。但是如果没有新的 HTML 结构,就无法写出具体的答案。
  • 这个怎么样&lt;div ng-repeat="series in serieslist"&gt; &lt;li&gt; &lt;div&gt;{{series.name}}&lt;/div&gt; &lt;div&gt;{{series.book[0].name}}&lt;/div&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/div&gt;
  • 这是我所期望的
    • 系列1的第1册
    • 系列1的第2册
    • 系列2的第1册
    • 系列2的book2
    • 系列3的book1
    • 系列3的book2

标签: javascript json angularjs nested ng-repeat


【解决方案1】:

既然你只想要一个书单,试试这个

<div ng-repeat="series in serieslist">
        <li>                  
            <div>{{series.name}}</div>
            <div>{{series.book[0].name}}</div>
        </li>            
    </ul>
</div>

希望对你有帮助!!!

【讨论】:

  • 感谢您的回答。我刚试了一下,它只显示系列名称和每个系列的第一本书的名称
【解决方案2】:

您需要先在控制器中将数组展平为具有序列号和书号的数组,然后在新数组上使用 ng-repeat。

为此,您可以在原始数组上使用两个 angular.forEach(一个用于系列,另一个用于每个系列中的书籍)。

$scope.serieslist = [];
    var seriesNumber = 1;
    angular.forEach(data.records, function(series) {
        var bookNumber = 1;
        angular.forEach(series.book, function(book) {
            $scope.serieslist.push(
                {
                    seriesNumber: seriesNumber,
                    bookNumber: bookNumber++,
                    seriesid: series.seriesid,
                    name: series.name,
                    book: book
                });
        });
        seriesNumber++;
    });

这是plnkr

【讨论】:

  • 感谢您的出色回答。它完美无缺。
【解决方案3】:

Working JS fiddle

只需替换 DOM 的元素以使用嵌套的ng-repeat

<div ng-app='Your app'>
     <div ng-controller='Your controlelr'>
        <ul ng-repeat="series in serieslist">            
            {{series.name}} 
            <li ng-repeat="book in series.book" >{{ book.name }}</li>
        </ul>
      </div>
 </div>

 <div ng-app='myApp'>
     <div ng-controller='Home'>
        <ul ng-repeat="series in serieslist">            
            <li ng-repeat="book in series.book" >{{ book.name }} of {{series.name}}</li>
        </ul>
      </div>
 </div>

for this result

【讨论】:

  • 感谢您的回答。这看起来像我目前的方法。我的问题是如何只用 1 ng-repeat 来做到这一点,因为嵌套的 ng-repeat 会生成多个列表,这使得实现换行非常困难
  • 可能在控制器中使用 angular.foreach 但我无法使用一个 ng-repeat,无论如何您都需要循环,因为有两个数组
【解决方案4】:

您可以使用 underscorejs 之类的东西来生成列表的扁平化版本,然后对其进行 ng-repeat。有关如何做到这一点,请在此处参考 Karl 对此 stackoverflow 问题的回答:How to flatten with ng-repeat

【讨论】:

  • 非常感谢您的回答。这就是我想要的。我使用 forEach 的 Angular 而不是 for 循环,它可以工作。
【解决方案5】:

控制器

$scope.serieslist = data.records;
    $scope.flatbooklist = [];
    angular.forEach($scope.serieslist, function (series)
    {
        angular.forEach(series.book, function (book)
        {
            $scope.flatbooklist.push({seriesname: series.name, seriesid: series.seriesid, bookname: book.name, bookid: book.bookid, bookimage: book.image});
        });
    });

HTML

<ul ng-repeat="book in flatbooklist">
    <li>
        <div>{{book.seriesname}}</div>
        <div>{{book.bookname}}</div>
    </li>
</ul>

【讨论】:

    猜你喜欢
    • 2018-06-28
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    相关资源
    最近更新 更多