4

我遇到了与 ng-init 相关的奇怪行为,任何帮助将不胜感激。

我有一个模型对象,它有一个 flats 属性,它是一组平面对象。每个平面对象都有 rooms 属性,它是房间对象的数组。

我正在尝试按如下方式显示公寓和房间;

<table ng-repeat="flat in model.flats" ng-init="flatIndex = $index">
<thead>
<tr>
    <td>{{flatIndex+1}}. {{flat.name}}</td>
</tr>
</thead>
<tbody>
<tr ng-repeat="room in flat.rooms" ng-init="roomIndex = $index">
    <td>{{roomIndex+1}}. {{room.name}}</td>
</tr>
</tbody>
</table>

如果我通过使用array.splice flatIndex和变量删除公寓或房间,即使ui 更新正确,roomIndex变量似乎也没有正确更新。$index

您可以在此处看到问题的实际效果。

尝试通过单击删除链接删除第 1、第 2 或第 3 套公寓或房间对象。从数组中删除最后一个对象并没有真正暴露问题。

任何解决方法也将不胜感激。

4

1 回答 1

2

这是您使用时的已知行为,不监视ng-init由设置的范围属性值,ng-init并且当您从数组中删除项目以反映刷新的索引位置时,它们不会更新。所以不要使用ng-init,而只是使用$index( deleteFlat($index)) 和flat对象引用(获取房间deleteRoom(flat,$index))。

<table ng-repeat="flat in model.flats track by flat.id">
<thead>
    <tr>
        <td colspan="2">{{$index+1}}. {{flat.name}}</td>
        <td><a href="#" ng-click="deleteFlat($index)">DELETE FLAT</a></td>
    </tr>
</thead>
<tbody>
    <tr ng-repeat="room in flat.rooms  track by room.id">
        <td>&nbsp;</td>
        <td>{{$index+1}}. {{room.name}}</td>
        <td><a href="#" ng-click="deleteRoom(flat,$index)">DELETE ROOM</a></td>
    </tr>
</tbody>
</table>

$scope.deleteFlat = function(flatIndex){
    $scope.model.flats.splice(flatIndex,1);
};

$scope.deleteRoom = function(flat,roomIndex){
   flat.rooms.splice(roomIndex,1);
};

PLNKR

或者最好使用 id 本身,deleteFlat(flat.id)并且deleteRoom(room.id, flat).

<table ng-repeat="flat in model.flats track by flat.id">
<thead>
    <tr>
        <td colspan="2">{{$index + 1}}. {{flat.name}}</td>
        <td><a href="#" ng-click="deleteFlat(flat.id)">DELETE FLAT</a></td>
    </tr>
</thead>
<tbody>
    <tr ng-repeat="room in flat.rooms track by room.id">
        <td>&nbsp;</td>
        <td>{{$index+1}}. {{room.name}}</td>
        <td><a href="#" ng-click="deleteRoom(room.id, flat)">DELETE ROOM</a></td>
    </tr>
</tbody>
</table>

$scope.deleteFlat = function(flatId){
  $scope.model.flats.splice(_getItemIndex(flatId, $scope.model.flats), 1);
};

$scope.deleteRoom = function(roomId, flat){
  flat.rooms.splice(_getItemIndex(roomId, flat.rooms), 1);
};


function _getItemIndex(imtId, itms){
  var id ;
  itms.some(function(itm, idx){
      return (itm.id === imtId) && (id = idx)
   });
   return id;
}

plnkr2

于 2014-09-22T13:12:51.627 回答