【问题标题】:ng-repeat loop through object in objectng-repeat 循环遍历对象中的对象
【发布时间】:2014-08-24 21:46:27
【问题描述】:

我很困惑如何遍历这个数据模型。

$scope.object = [ {person1: {name: 'jon', height: 100}} , {person2: {name: 'joe', height: 200}}, {person3: {name: 'lisa', height: 150}}]

我正在尝试这样的 ng-repeat

<tr ng-repeat = "person in object[0]">
    <td>{{person.name}}</td>
</tr>

这当然只会显示“jon”。我怎样才能得到所有人(x).name?我可以将它们全部命名为 person 而不是 person1、person2,但我的项目数据模型不允许这样做。能做什么?

谢谢

【问题讨论】:

  • 您是否尝试过编写指令来实现这一目标?您将首先转换模型,然后将其发送到范围
  • 数据不一致。能否请您发布正确的对象数据?
  • @GruffBunny 这行不通,因为“对象中的人”只会返回“{person1:{..}}”等,因为对象数组中的每个索引都是一个对象。
  • @Raghav 数据不一致是什么意思?
  • @Garuuk:你所拥有的不是有效的 JavaScript。发布真实的结构。

标签: javascript angularjs loops angularjs-ng-repeat ng-repeat


【解决方案1】:

抛开对象数据中缺少的大括号,你可以做一些愚蠢的事情

<tr ng-repeat="person in object">
    <td ng-repeat="keys in person">
        {{keys.name}}
    </td>   
</tr>

...这会做你想要的(内部 ng-repeat 只会循环一次,因为每个“人”只有一个键(“person1”,“person2”......)但更好的解决方案是可能会更改您的数据结构以删除那些不必要的 person1、person2 等标识符并将其视为数组:

$scope.object = [
    {name:'Joe'},
    {name:'Susan'}
];

或删除数组括号并将其视为哈希表:

$scope.object = {
    person1: {name:'Bob'}, 
    person2: {name:'Ted'}
};

使用这些数据结构中的任何一个,您的 HTML 模板都是一样的:

<tr ng-repeat="person in object">
    <td>{{person.name}}</td>
</tr>

现在您正尝试将其构造为数组和哈希,这没有任何好处,只会使访问数据变得更加笨拙。

【讨论】:

  • 你说得对,笨拙。在这一点上,这有点超出我的控制。 Ganna 尝试双重 ng-repeat 方式
  • 您不能更改指令?您所要做的就是将这些方括号变成大括号...
  • 它在后端,我可以而且最终会。但就目前而言,很高兴知道一种解决方法。感谢您的回答@DanielBeck
【解决方案2】:

如果您的模型要返回 person1、person2、person3 等中的数据。 这里是直接的回答。

下面是 HTML

<div ng-controller="MyCtrl">
   <div ng-repeat = "person in object">
      <div make-json> </div>
   </div>
</div>

这是我的控制器和指令

var app = angular.module('myApp', []);

function MyCtrl($scope) {
    $scope.object = [{
        person1: {
            name: 'jon',
            height: 100
        }
    }, {
        person2: {
            name: 'joe',
            height: 200
        }
    }, {
        person3: {
            name: 'lisa',
            height: 150
        }
    }];
}

app.directive('makeJson', function() {
    return {
        restrict: 'AEC',
        link: function(scope, elm, attrs) {
            var formattedText = "person";
            formattedText = formattedText + (parseInt(scope.$index) + 1);
            elm.text(scope.person[formattedText.toString()].name);
        }
    };
});

希望这对您有用。谢谢。

【讨论】:

  • 小心elm.text() -- 直接写入 DOM 意味着你失去了双向数据绑定。 (有时出于性能原因,您确实需要做这种事情,如果您确定基础数据不会改变,但默认使用该模式可能不是一个好习惯......)
猜你喜欢
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 2021-11-20
  • 2014-02-22
  • 2020-12-06
  • 1970-01-01
  • 2020-04-30
相关资源
最近更新 更多