【问题标题】:multidimensional array in angular角度的多维数组
【发布时间】:2014-02-11 19:41:51
【问题描述】:

我有一个来自 API 的多维数组。是否可以以编程方式循环遍历数组?

{
    success: true,
    categories: [{
            cat_id: "2",
            name: "This is category One",
            description: null,
            photo_url: "/img/test.png",
            order: "1",
            items: [{
                    item_id: "1",
                    title: "Desk",
                    item_url: "/690928460",
                    photo_url: "/desk.png",
                }, {
                    item_id: "2",
                    title: "Chair",
                    item_url: "/18882823",
                    photo_url: "/chair.png",
                },
            }]
    }]
}

我的控制器如下所示:

myApp.controller('items', function($scope, $http, $location, Data) {
    var apiUrl = '/api/items';
    $http.get(apiUrl).
    success(function(data) {
        $scope.data = Data;
        $scope.allData = data;
    });
    $scope.changeView = function(view) {
        $location.path(view);
    }
});

Angular 索引文件只有:<div ng-view=""></div>

查看文件

<div class="scrollable categories-container animated-fast slideInUp">
    <div class="container categories">
        <div class="row" ng-repeat="categories in allData">
            <div class="col-xs-6" ng-repeat="category in categories">
                <div class="items">
                    <div class="title">
                        {{ category.name }}
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

我可以很好地遍历类别名称,但是当尝试返回 for EACH 类别的项目时,我不明白其背后的逻辑......

【问题讨论】:

  • 你能解释得更好吗? allData 是什么?是不是顶部的完整 json 所以allData.success 是真的?
  • 您的 JSON 错误,您是复制过去还是从头开始编写?项目末尾有一个额外的“,}”。
  • 你尝试过做什么?这对你有什么好处:ng-repeat="item in category.items"。然后使用{{ item.title }}
  • @ZackArgyle 抱歉,是的,我是从头开始写的——忘记了 ;最后
  • @JasonGoemaat allData 是我从 API 获得的数据

标签: javascript arrays angularjs multidimensional-array


【解决方案1】:

我建议使用一些简单的嵌套 for 循环,因为每个循环都会增加复杂性。 由于我不确定您想对数据做什么,所以我们只创建一个包含所有项目名称和所有类别名称之一的数组:

在你的成功函数中:

var items = [], categories = []
for(var i = 0; i < data.categories.length;i++){
    categories.push(data.categories[i].name);
    for(var j = 0; j < data.categories[i].items.length;j++){
        items.push(data.categories[i].items[j].name);
    }
}
console.log(categories);
console.log(items);

编辑:

不知何故完全错过了您的 html 代码,这是我的解决方案:

<div class="scrollable categories-container animated-fast slideInUp">
    <div class="container categories">
        <div class="col-xs-6" ng-repeat="category in allData.categories">
            <div class="items">
                <div class="title">
                    {{ category.name }}
                </div>
            </div>
        </div>
    </div>
</div>

编辑 2:

关于您的评论: 如果您想根据类别的选择来选择辅助视图的内容(即项目),我建议使用 ng-click 属性。可以使用指令但不是必需的:

<div class="scrollable categories-container animated-fast slideInUp">
    <div class="container categories">
        <div class="col-xs-6" ng-repeat="category in allData.categories">
            <div class="title" ng_click="selected_category = category">
                {{ category.name }}
            </div>
        </div>

        <div class="col-xs-6" ng-repeat="item in selected_category.items">
            <div class="title">
                {{ item.name }}
            </div>
        </div>
    </div>
</div>

因此,当您加载类别数据时,第一个 ng-repeat 会填充类别。每个具有类标题的 div 都会有一个在单击时调用的函数,这将使 selected_category 对象等于所选类别。 然后,这将导致第二个视图通过 Angular 的双向绑定填充所选类别中的所有项目。

【讨论】:

  • 有没有办法只显示一个类别的数据?例如:在类别视图中它显示类别,但是当您按下一个类别时,它会将您带到另一个视图以显示所选类别中的项目。
  • 当然,您可以 (1) 将其作为主要内容并通读 ng-view 和 routeprovider 文档或 (2) 使用 ng-include 和模板或 (3) 制作自己的指令.我会使用第 3 个,但如果这些类别是视图的主要焦点,或者视图是否指向您的整个页面,请向我解释:基本上是您想要完成的目标
  • 谢谢老兄,感激不尽。基本上这是一个小应用程序;用户登录,有一个收件箱(视图),有一个从一堆类别(另一个视图)中选择的按钮,并且在每个类别中都有用户可以选择的该类别的项目。所有数据都是通过 api 填充的。我还在学习,我可以在 javascript 中做到这一点,但想使用 angular 来学习
猜你喜欢
  • 1970-01-01
  • 2018-06-12
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
相关资源
最近更新 更多