在 ng-repeat 中的集合的特定元素中触发操作

Trigger action in a particular element of a collection inside an ng-repeat

我有一个使用 ng-repeat 显示的对象数组。在这些对象中的每一个中,都有一个按钮可以触发 API 请求并切换一个标志以显示隐藏的 div。这是 HTML:

<div ng-repeat="tarjeta in tarjetas">
<label class="radio-inline">
    <input type="radio" name="card" checked>  {{tarjeta.brand}} ************{{tarjeta.digits}}  
    <button class="btn btn-dropdown" ng-click="openEditCard(); getEditableInfoCard(tarjeta.id)" ng-show="!editCard"></button>
    <button class="btn btn-up" ng-click="openEditCard()" ng-show="editCard"></button>
</label> 
<div ng-show="editCard">
    <input type="text" name="nombre" placeholder="Nombre en la tarjeta:" class="form-control" ng-model="editableInfo.name" required>
    <p ng-show="validaUpdateName">Dato incorrecto</p>
    <div style="float: left; margin-right: 15px;">
        <input type="text" name="expM" placeholder="Expiración (MM):" maxlength="2" class="form-control" ng-model="editableInfo.exp_month" required>
        <p ng-show="validaUpdateMM">Dato incorrecto</p>
    </div>
    <label class="dash">
        /
    </label>
    <div style="float: left;">
        <input type="text" name="expY" placeholder="Expiración (YYYY):" maxlength="2" class="form-control" ng-model="editableInfo.exp_year" required>
        <p ng-show="validaUpdateYY">Dato incorrecto</p>
    </div>
    <input type="text" name="direccion" placeholder="Dirección de la tarjeta:" class="form-control" required>
    <br>
    <br>
    <br>
    <div style="float: right;">
        <button class="btn btn-primary" ng-click="updateCard(tarjeta)">Guardar cambios</button>
        <button class="btn btn-trash"></button>
    </div>
</div>

问题是,当我单击单个元素上的按钮时,数组中的每个元素都会触发该操作。我认为这很容易解决,但我是使用 Angular 的初学者,无法弄清楚问题出在哪里。我已经尝试通过 $index 进行跟踪。这让我发疯,欢迎任何帮助。

确实和angular关系不大。只有逻辑。

您使用的是单个布尔值 editCard,并且基于该布尔值,您应该知道哪些卡片应该打开,哪些不应该打开。那是不可能的。单个布尔值无法存储那么多信息。只有真假。

相反,对于每张卡,您需要知道它是否已打开。所以每张卡片应该有自己的布尔标志:

<div ng-repeat="tarjeta in tarjetas">
    <button ng-click="tarjeta.edited = true" ...></button>
    <button ng-click="tarjeta.edited = false" ...></button>

    <div ng-if="tarjeta.edited">
        ...
    </div>
</div>

如果一次只能打开一张卡,那么你需要知道打开的是哪张卡。同样,布尔值不能存储该信息。所以你需要

<div ng-repeat="tarjeta in tarjetas">
    <button ng-click="edit(tarjeta)" ...></button>
    <button ng-click="edit(null)" ...></button>

    <div ng-if="tarjeta === editedTarjeta">
        ...
    </div>
</div>

在控制器中:

$scope.editedTarjeta = null;
$scope.edit = function(tarjeta) {
    $scope.editedTarjeta = tarjeta;
};