使用 ng-repeat 显示包含重复项的对象子数组列表,每个索引有 1 个项目符号

Display list of object's child arrays containing dupes with 1 bullet per index using ng-repeat

提问人:Hack-R 提问时间:10/3/2016 最后编辑:Hack-R 更新时间:10/3/2016 访问量:160

问:

我有一个对象 (),其中包含 3 个长度相等的数组(、 和 )。searchedMenunameshort_namedescription

for(var i=0;i<description.length;i++){
    searchedMenu.name[i] = description[i].name;
    searchedMenu.short_name[i] = description[i].short_name;
    searchedMenu.description[i] = description[i].description;
} 
menu.searchedMenu = searchedMenu;

我想将每个 , , 和显示为无序列表项,如下所示:nameshort_namedescription

  • 名称 1、short_name1、描述1
  • 名称 2、short_name2、描述2

我正在努力做到这一点。我已将我的控制器声明为相关div

<div class="container" ng-controller = "NarrowItDownController as narrow">

如果我这样做:

<ul>
  <li ng-repeat="item in narrow.searchedMenu"> {{item}}</li>
</ul>

我得到 3 个项目符号,其中包含每个数组的所有元素,如下所示:

  • name1、name2,...
  • short_name1,short_name2,......
  • 描述1, 描述2, ...

如果我这样做:

  <li ng-repeat="item in narrow.searchedMenu"> {{item.name}}, {{item.short_name}}, {{item.description}}</li>

我得到:

  • , ,
  • , ,
  • , ,

作为一个实验,我也尝试了这个:

<li ng-repeat="item in narrow.searchedMenu.name"> {{item}}</li>

它在浏览器中没有给我任何信息,控制台错误为:

错误:[ngRepeat:dupes] http://errors.angularjs.org/1.5.8/ngRepeat/dupes?p0=item%20in%20narrow.searchedMenu.name&p1=string%3AOrange%20Chicken&p2=Orange%20Chicken

是:console.log("Searched menu: ", menu.searchedMenu);

Searched menu:  Object {name: Array[219], short_name: Array[219], description: Array[219]}

完整的控制器代码是(这是一项正在进行的肮脏工作):

NarrowItDownController.$inject = ['MenuSearchService'];
function NarrowItDownController(MenuSearchService) {
  var menu = this;

  var promise = MenuSearchService.getMatchedMenuItems();
  var item_name = ["",""];
  var description;

  var searchValue = "ton";
  function containsFilter(value) {
    return value.indexOf(searchValue) !== -1;
  }

  promise.then(function (response) {
    menu.results = response.data;
    menu.results = menu.results.menu_items;

    description = response.data;
    description = description.menu_items;
    console.log(description);

    var searchedMenu = {};
    searchedMenu.name = [];
    searchedMenu.short_name = [];
    searchedMenu.description = [];

    for(var i=0;i<description.length;i++){
        searchedMenu.name[i] = description[i].name;
        searchedMenu.short_name[i] = description[i].short_name;
        searchedMenu.description[i] = description[i].description;
    }

    console.log(searchedMenu);
    menu.searchedMenu = searchedMenu;//description.filter(containsFilter);
    console.log("Searched menu: ", menu.searchedMenu);

  })
  .catch(function (error) {
    console.log("Something went terribly wrong.");
  });

  menu.logMenuItems = function (searchTerm) {
    var promise = MenuSearchService.getMatchedMenuItems(searchTerm);

    promise.then(function (response) {
      console.log(response.data);
    })
    .catch(function (error) {
      console.log(error);
    })
  };

}

请注意,我在上面的示例中对搜索词进行了硬编码,因为它是一项正在进行的工作。

JavaScript HTML AngularJS 数组

评论

0赞 Feras Salim 10/3/2016
你的 Angular 控制器代码在哪里?
0赞 defaultcheckbox 10/3/2016
也可以向我们展示 narrow.searchedMenu 的控制台.log
0赞 Hack-R 10/3/2016
@FerasSalim 第一个代码块是控制器代码的关键部分,但我可以添加更多代码,没问题。给我 10 秒钟。
0赞 Hack-R 10/3/2016
@defaultcheckbox 当然是这样说的Object {name: Array[219], short_name: Array[219], description: Array[219]}
1赞 Troopers 10/3/2016
为什么需要将数组转换为 3 个数组。您可以使用 和绑定 ,并且descriptionng-repeat="item in description"item.nameitem.short_nameitem.description

答:

0赞 nikjohn 10/3/2016 #1

如果你不需要拆分它,你应该这样做

<ul>
 <li ng-repeat="item in description"> {{item.name}}, {{item.shortName}},{{item.description}},</li>
</ul>

评论

0赞 Hack-R 10/3/2016
这不会导致我的浏览器中显示任何内容
0赞 nikjohn 10/3/2016
你们的数据结构是什么?你能举个例子吗
0赞 Hack-R 10/3/2016
当然,所以这个对象有你在答案中的那 3 个数组。如果您想查看原始数据,请点击此处:davids-restaurant.herokuapp.com/menu_items.json
5赞 user449689 10/3/2016 #2

试试这个:

<ul>
  <li ng-repeat="item in narrow.searchedMenu.name track by $index"> {{ item }}, {{ narrow.searchedMenu.short_name[$index] }}, {{ narrow.searchedMenu.description[$index] }}</li>
</ul>

该对象包含三个数组,因此您可以遍历其中一个数组,并在循环的每个步骤中,使用 .searchedMenu$index

AngularJS 不允许在 ng-repeat 指令中重复,因此您必须添加到中继器track by $index

评论

0赞 Hack-R 10/3/2016
成功了!!!!:-)谢谢,太棒了。我从来不知道.track by
0赞 Troopers 10/3/2016 #3

在控制器中:

menu.searchedMenu = description;

在模板中:

<ul>
 <li ng-repeat="item in searchedMenu"> {{item.name}}, {{item.shortName}},{{item.description}},</li>
</ul>

评论

0赞 Hack-R 10/3/2016
这在控制台中看起来不错,但浏览器中没有任何内容。也许是因为控制器作为语法(即?narrow
0赞 Pivote 10/3/2016 #4

首先,我认为对于 isla 没有必要,因为部分数据和 menú 的键值相同,所以我建议只做最后一部分,即 menu.searchedMenu = searchedMenu;并将右侧的 searchedmenu 更改为您的描述,第二个 ir 左侧部分位于控制器内部,将 menú 更改为此变量,并在 ng 中重复放置:

<li ng-repeat="item in searchedMenu"> {{item.name}}, {{item.short_name}}, {{item.description}}</li>

它应该可以工作