【问题标题】:Comparing values in AngularJS ng-repeat比较AngularJS ng-repeat中的值
【发布时间】:2017-03-22 16:34:27
【问题描述】:

我有一个 JSON 对象,其中包含多个客户,每个客户我有多个月份,并在该月的特定日期范围内付款。

我正在尝试遍历此客户列表以显示每个客户的表格,并在此表格中显示该月的付款。棘手的部分是我需要强调付款与上一时期不同的情况。我的问题是我设法比较了同一个月的付款,但是我没有设法比较当月第一期的付款与上个月最后一期的付款。

这是我的 JSON(由旧系统返回):

{  
 "customers":[  
    {  
     "name":"John",
     "months":{  
        "1":{  
           "details":[  
              {  
                 "startDate":1483225200000,
                 "endDate":1483830000000,
                 "payment":250
              },
              {  
                 "startDate":1483916400000,
                 "endDate":1485817200000,
                 "payment":350
              }
           ]
        },
        "2":{  
           "details":[  
              {  
                 "startDate":1485903600000,
                 "endDate":1487026800000,
                 "payment":350
              },
              {  
                 "startDate":1487113200000,
                 "endDate":1488236400000,
                 "payment":350
              }
           ]
        },
        "3":{  
           "details":[  
              {  
                 "startDate":1488322800000,
                 "endDate":1490911200000,
                 "payment":250
              }
           ]
        },
        "4":{  
           "details":[  
              {  
                 "startDate":1490997600000,
                 "endDate":1491688800000,
                 "payment":275
              },
              {  
                 "startDate":1491775200000,
                 "endDate":1493503200000,
                 "payment":275
              }
           ]
        }
     }
  },
  {  
     "name":"Bob",
     "months":{  
        "1":{  
           "details":[  
              {  
                 "startDate":1483225200000,
                 "endDate":1483830000000,
                 "payment":250
              },
              {  
                 "startDate":1483916400000,
                 "endDate":1485817200000,
                 "payment":350
              }
           ]
        },
        "2":{  
           "details":[  
              {  
                 "startDate":1485903600000,
                 "endDate":1487026800000,
                 "payment":350
              },
              {  
                 "startDate":1487113200000,
                 "endDate":1488236400000,
                 "payment":350
              }
           ]
        },
        "3":{  
           "details":[  
              {  
                 "startDate":1488322800000,
                 "endDate":1490911200000,
                 "payment":250
              }
           ]
        },
        "4":{  
           "details":[  
              {  
                 "startDate":1490997600000,
                 "endDate":1491688800000,
                 "payment":275
              },
              {  
                 "startDate":1491775200000,
                 "endDate":1493503200000,
                 "payment":275
              }
           ]
        }
     }
  },
  {  
     "name":"Jane",
     "months":{  
        "1":{  
           "details":[  
              {  
                 "startDate":1483225200000,
                 "endDate":1483830000000,
                 "payment":250
              },
              {  
                 "startDate":1483916400000,
                 "endDate":1485817200000,
                 "payment":350
              }
           ]
        },
        "2":{  
           "details":[  
              {  
                 "startDate":1485903600000,
                 "endDate":1487026800000,
                 "payment":350
              },
              {  
                 "startDate":1487113200000,
                 "endDate":1488236400000,
                 "payment":350
              }
           ]
        },
        "3":{  
           "details":[  
              {  
                 "startDate":1488322800000,
                 "endDate":1490911200000,
                 "payment":250
              }
           ]
        },
        "4":{  
           "details":[  
              {  
                 "startDate":1490997600000,
                 "endDate":1491688800000,
                 "payment":275
              },
              {  
                 "startDate":1491775200000,
                 "endDate":1493503200000,
                 "payment":275
              }
           ]
        }
     }
  }
 ]
}

这是我的 HTML,我在其中尝试使用 ng-repeat 进行循环,并在付款与上一次付款不同时尝试应用“highlight”类:

<table ng-repeat="customer in customersList">
<tbody ng-repeat="month in customer.months">
    <tr ng-repeat="detail in customer.details track by $index">
        <td data-ng-class="{'highlight' : month.details[$index-1].payment != month.details[$index].payment && $index > 0}">{{::detail.payment}} {{month.details[$index-1].payment != month.details[$index].payment && $index > 0}}</td>
        <td data-ng-class="{'highlight' : month.details[$index-1].payment != month.details[$index].payment && $index > 0}">{{::detail.payment | currency}} {{$parent.customers.months[$index].details[$index-1].payment}}</td>
    </tr>
</tbody>
</table>

我尝试使用 $parent 尝试访问上个月并能够将上个月的最后一笔付款与新月份的第一笔付款进行比较,但是失败了。谁能告诉我我做错了什么以及这是否可能?

【问题讨论】:

    标签: javascript angularjs json angularjs-ng-repeat


    【解决方案1】:

    您当前的实现失败了,因为$indexmonth.details 中的索引,而您想要customer.months 中的索引。

    这就是the ng-init directive 的用途。

    我不能 100% 确定您打算如何比较付款,但我相信您想要这样的东西:

    <table ng-repeat="customer in customersList">
    <tbody ng-repeat="month in customer.months">
        <tr ng-init="monthIndex = $index" ng-repeat="detail in customer.details track by $index">
            <td data-ng-class="{'highlight' : customer.months[monthIndex - 1].details[$index].payment != month.details[$index].payment && monthIndex > 0}">
                {{::detail.payment}} {{customers.months[monthIndex - 1].details[$index] != month.details[$index].payment && $index > 0}}
            </td>
            <td data-ng-class="{'highlight' : customer.months[monthIndex - 1].details[$index-1].payment != month.details[$index].payment && monthIndex > 0}">
                {{::detail.payment | currency}} {{customers.months[monthIndex - 1].details[$index].payment}}
            </td>
        </tr>
    </tbody>
    </table>
    

    这会将monthIndex 设置为进入month.details 循环之前的当前月份的索引。此范围变量在 month.details 循环中可用,因此您可以使用 monthIndex - 1 查看上个月。

    【讨论】:

    • 你的回复让我更接近了:) - 我唯一的问题是我需要将 monthIndex 设置为等于适当的数字 - 比如 1 是 1 月、2 月 2 日等。我可以得到一个实例,我只能从 6 月到 12 月获得几个月(例如,上面的示例仅显示 1 月到 4 月),因此索引不匹配。有没有办法将月份索引设置为等于当前循环的月份数?
    • 好的,我已经使用 customer.months 中的 (key, month) 中的键正确设置了 monthIndex
    • 啊,是的,months 是一个哈希,而不是一个数组。那么你有它的工作吗?为了将来参考,提供一个您希望输出的示例会很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    相关资源
    最近更新 更多