Angularjs ng-在数组中重复数组

Angularjs ng-repeat array in array

我想在列表中显示另一个数组中的一个数组。我想使用 ng-repeat 在列表中显示数组。我尝试了各种组合,但我无法让它发挥作用。我有以下代码:

var workouts = this;  
    workouts.workoutslist = [  
        {'workoutId': 1,   
         'workoutName': "Maandag",  
         'exercises':  
                    [   
                        {exerciseId: 1,  
                        exerciseName: "exercise1"},  
                        {exerciseId: 2,  
                        exerciseName: "exercise2"}  
                    ]  
        },  
        {
            'workoutId': 2,   
            'workoutName': "Dinsdag",  
            'exercises':  
                    [ 
                        {exerciseId: 3,  
                        exerciseName: "exercise3"},  
                        {exerciseId: 4,  
                        exerciseName: "exercise4"}  
                    ]
        }
    ];

这个有效:

<li class="item" ng-repeat="workoutTest in workout.workoutslist[0].exercises">{{ workoutTest.exerciseName }}
            </li>

但这不是:

    <li class="item" ng-repeat="workoutTest in workout.workoutslist.exercises  |filter:{workoutId: workoutId}">
{{ workoutTest.exerciseName }}
                </li> 

我在第二个代码中说的不是完全一样吗?
编辑:Plunker:http://plnkr.co/edit/1VQBkuTWAVatexPMsxOd?p=preview

问题解释:

之所以有效,是因为它针对 单次锻炼:

workoutTest in workout.workoutslist[0].exercises

这行不通:

workoutTest in workout.workoutslist.exercises | filter:{workoutId: workoutId}

因为 过滤器应用于不存在的 属性 "exercises" 锻炼列表数组

解决方案一:

如果你想显示由 id 选择的单个锻炼的练习 - 尝试将你的锻炼定义为这样的对象:

workouts.workoutslist = { 
    "1": {
        'workoutName': "Maandag",  
        'exercises': [   
            {exerciseId: 1, exerciseName: "exercise1"},  
            {exerciseId: 2, exerciseName: "exercise2"}  
        ]  
    },  
    "2": {
        'workoutName': "Dinsdag",  
        'exercises': [ 
            {exerciseId: 3, exerciseName: "exercise3"},  
            {exerciseId: 4, exerciseName: "exercise4"}  
        ]
    }
};

并像这样访问它:

exercise in workout.workoutslist[workoutId].exercises

方案二:

如果您想显示包含练习列表的锻炼列表,而不是像这样实现两级列表:

<ul>
    <li ng-repeat="w in workout.workoutslist">
        <span>{{w.workoutName}}<span>
        <ul>
            <li ng-repeat="e in w.exercises">{{e.exerciseName}}</li>
        </ul>
    </li>
</ul>

您可以像这样 ng-repeat 嵌套数组:

<li ng-repeat="workout in workoutslist">
  <ul>
    <li ng-repeat="exercise in workout.exercises"></li>
  </ul>
</li>

请注意,它比您拥有的要简单得多 - 我也会以不同的方式定义对象。这更容易:

$scope.workoutslist = [];

而不是:

workouts.workoutslist = [];

JSFiddle

您的第二次提取似乎无法正常工作。如果我举第一个例子,我们有以下类型用于您的 ng-repeat 指令中使用的不同元素:

workout --> object
workout.workoutslist --> array
workout.workoutslist[0] --> object
workout.workoutslist[0].exercises --> array

对第二个代码摘录做同样的练习,您会发现它是如何不起作用的。

workout.workoutlist --> array
workout.workoutlist.exercises --> ???

实际上,我什至不确定你在那之后想用过滤器做什么(但到目前为止我还没有机会使用 AngularJS 那么多,所以可能就是这样我还没有遇到过那种使用过滤器的情况。

如果您只想列出练习,而不关心包含它们的锻炼,最好的办法可能是在您的控制器中定义一个函数,该函数负责构建练习对象数组并将其与ng-repeat。当然,您也可以使用嵌套的 ng-repeat,但每个都必须绑定到不同的 HTML 元素,这在您的上下文中可能无法做到。

像简单的嵌套循环一样使用它.. 更简洁的方法就像...

<li ng-repeat="workout in workoutslist"> <ul> <li ng-repeat="exercise in workout.exercises"></li> </ul> </li>