Show/hide 动态创建的元素之一

Show/hide one of the dynamically created elements

我有一个我无法解决的简单问题。动态创建了多个元素(见附图),我只需要 show/hide 我点击的元素的下拉内容。 下面的代码是 showing/hiding 按任何按钮的所有元素。

我可以通过 {{ loop.index }} 获取 for 循环的索引,并使用它为每个下拉列表动态创建一个 id 或将其作为参数,但在使用它和操作下拉内容以显示或隐藏时仍然存在问题。

toggleDropdown()isVisible 变量设置为 true 或 false,并根据下拉列表是否显示的值设置。

这是我的控制器:

OffersCtrl.$inject = ['PROFILE_ID', '$location'];

function OffersCtrl(PROFILE_ID, $location) {
  let vm = this;

  vm.isVisible = false;
  vm.getText = getText;
  vm.toggleDropdown = toggleDropdown;

  function toggleDropdown() {
    vm.isVisible = !vm.isVisible;
  }
}

这是我的 html/twigOffersCtrl 定义为 $ctrl):

<ul class="offer-tiles">
    {% for offer in profile.offers %}
    <li>
        <div class="content">
            <p class="title">{{ offer.title }}</p>

            <p class="price">
                <span class="symbol">€</span>
                <span class="value">{{ offer.price.convertedAmount }}</span>
            </p>

            <p class="description">{{ offer.category.name }}</p>

            <input type="button" id="expandBtn" class="expand" value="v" ng-click="$ctrl.toggleDropdown()" />
        </div>
        <div class="box-dropdown" ng-show="$ctrl.isVisible">
            <p>{{ offer.description }}</p>
            <hr/>
            .... 
        </div>
    </li>
    {% endfor %}
</ul>

您必须使用 isVisible 作为数组,因为您有多个值。

angular.module('app', [])
  .controller('ctrl', function() {
    const vm = this;

    vm.isVisible = [];
    vm.toggleDropdown = toggleDropdown;
    vm.offers = [
      {description: 'lorem'},
      {description: 'ipsum'},
      {description: 'dolor'},
      {description: 'sit'},
      {description: 'amet'},
    ]

    function toggleDropdown(index) {
      vm.isVisible[index] = !vm.isVisible[index];
    }
  });
<div ng-app="app" ng-controller="ctrl as vm">
  <ul class="offer-tiles">
    <li ng-repeat="offer in vm.offers track by $index">
        <!-- ... -->
        <input type="button" value="v" ng-click="vm.toggleDropdown($index)" />
        <div class="box-dropdown" ng-show="vm.isVisible[$index]">
            <p>{{ offer.description }}</p>
            <hr />
            ...
        </div>
    </li>
  </ul>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.7.2/angular.min.js"></script>