Я пытаюсь отобразить ответ JSON в таблице, используя ng-repeat. Проблема в том, что не все получаемые объекты одинаковы. У всех из них есть дата, короткое сообщение и длинное сообщение. Есть также те, у которых есть дополнительный список значений, отличающийся по длине. Этот список должен быть размещен под длинным сообщением в его собственной таблице или списке. Я использую alert.slice().reverse()
потому что я хочу, чтобы новые записи были сверху. Новые объекты вставляются с помощью .push({values})
.
<tbody class="AlTbody" ng-repeat="alerts in alerts.slice().reverse()" ng-class="className">
<tr class="Altr Aldate">
<td ng-show="{{alerts.Date}}"><b>{{alerts.Date}}:</b>
</td>
</tr>
<tr class="Altr Alshort " ng-click="toggleDetail($index)">
<td>{{alerts.S}}</td>
</tr>
<tr class="Altr " ng-show="activePosition == $index">
<td class="msgL">{{alerts.L}}
<!-- 1) <p ng-show="{{item.List}}"><br><ul><li>Previous values:</li> <li ng-repeat="vals in ValueList">{{vals.value}}</li></ul> </p>-->
<!-- 2) <p ng-show="{{List.txt}}"> <br><ul><li>Previous values:</li> <li ng-repeat="List in alerts.List">{{List.txt}}</li></ul> </p>-->
</td>
</tr>
</tbody>
Я уже пробовал два подхода, как показано в коде. Первый отобразил список правильно, однако он отображался под каждым длинным сообщением, а не только с тем, к которому он принадлежит. Я использовал новую переменную.
var l=valList.length;
scope.List=true;
while(l>-1){
scope.ValueList.push({value: valList[l]});
l--;
}
Второй подход не работал вообще, потому что я не мог найти индекс.
var l=valList.length;
var indexV= jQuery.inArray(currdate,scope.alerts.Date);
while(l>-1){
scope.alerts[indexV].List.push({txt: valList[l]});
l--;
}
edit: Это текущий вывод. Там вы можете увидеть два объекта (дата, короткое сообщение и длинное сообщение), и оба из них имеют раздел предыдущих значений. Однако предполагается, что только верхний объект должен отображать список предыдущих значений.
То, что вы пытаетесь достичь, вполне возможно, мой совет - начать с известной точки и работать оттуда.
Я собрал jsfiddle, чтобы показать вам, как будут работать вложенные ng-повторы. попытайтесь работать с этого момента. Как побочная заметка, похоже, что ваша структура JSON слишком сложна, если вы можете упростить это, я бы это сделал.
https://jsfiddle.net/roscorcoran/wyu7tgxm/
<div ng-app="App" ng-controller="Ctrl1">
<div ng-repeat="alert in alerts">
<a ng-if="alert.Date">{{alert.Date}}</a>
<p ng-repeat="val in alert.L.vals">
<a ng-if="val && val.value">{{val.value}}</a>
</p>
<p ng-repeat="item in alert.List">
<a ng-if="item && item.txt">{{item.txt}}</a>
</p>
</div>
</div>
Ладно, теперь это работает для меня. Он по-прежнему всегда отображает "Предыдущие значения:", но значения отображаются только тогда, когда они действительно принадлежат к сообщению.
<ul ng-if="alerts.List.vals"><li>Previous values:</li> <li ng-repeat="val in alerts.List.vals" >{{val.value}}</li></ul>
Это может быть не самое лучшее и элегантное решение, но оно работает.
if(valList){
scope.alerts.push({Date:currdate,S:msgSn,L:msgLn, List:{ vals:[{value:valList[0]},{value:valList[2]},{value:valList[4]},{value:valList[6]}] } });
}else{
scope.alerts.push({Date:currdate,S:msgSn,L:msgLn });
}
Я показываю только индексы массива значений, потому что список значений - это строка, которую я разделяю, и каждая нечетная запись "):" которую мне не нужно отображать.
Вы можете попытаться добавить инструкцию ng-if
внутри цикла ng-repeat:
<p ng-if="{{values.list}}"><br><ul><li>Previous values:</li> <li ng-repeat="vals in values.list">{{vals.value}}</li></ul> </p>-->