如何使用 ng-show 在 ng-repeat 中显示特定的 div?

how to use ng-show to display specific divs inside an ng-repeat?

我有一个 ng-repeat div 可以根据动态项目列表动态显示一组 div 标签,每个标签都有一个唯一的 Id ,一个类型和一个 "title" 值,它们都是字符串,我为每个字符串分配了一个点击函数。当我想点击其中一个 divs 时,我想显示一个单独的 div 与点击的 div 相关联,我想使用 ng-show 来做到这一点moment 有一个条件,这个 item/div 的 id 应该是 equal/equivalent 我在与 html 关联的控制器中定义的范围变量,用于显示这个新的 div。

我遇到的问题是,这些单独的 div 中的每一个都在显示并假设所有 ng-shows 都是真实的,但事实并非如此,我不确定为什么发生这种情况是因为项目的所有 ID 都是唯一的。我已经打印到控制台,看不到变量分配有任何问题,但不确定我是否遗漏了有关 ng-show 条件的内容。

这是我目前在 html 中的 2 个 div 示例(不用担心复制所有样式,我只是想弄清楚 [= =25=]东西):

<div class="col-md-12 col-sm-12 col-xs-12  " ng-repeat="item in items track by item.id"  ng-click="onClick(item.id)">

  //first type div that is clickable
  <div class="row">
    <div>
      <header class="text">
        <h1 data-ng-if="item.title" ng-bind-html="item.title"></h1>
      </header>
    </div>
  </div>

  //div to be displayed after associated first div type is clicked 
  <div class=" col-sm-11 row"  ng-show="displayMessage===item.id"   >
      <header class="col-sm-12 text">
          <h1  data-ng-if="item.title" ng-bind-html="item.title"></h1>
      </header>
      <p class="col-sm-12" > text about {{item.id]} </p>
  </div>

  //2nd type of  div 
  <div class="row"  style=" background: linear-gradient(135deg, #156570, #1e9d8b);">
      <h1 data-ng-if="item.title" ng-bind-html="item.title"></h1>
      <i class="ms-icon ms-icon-heart-rate"></i>
      <div class="clearfix"></div>
  </div>

  //div to be displayed after associated second div is clicked 
  <div class="col-md-11 col-sm-11 col-xs-11"  ng-show="displayMessage===item.id">

    <div style="background: linear-gradient(135deg, #156570, #1e9d8b);"></div>

    <h1 class="col-sm-12 col-xs-12"  data-ng-if="item.title" ng-bind-html="item.title" style="color:#000"></h1>

    <p class="col-sm-12 col-xs-12 "> text associated with {{item.id}}
    </p>

  </div>

</div>

这是我拥有的简单点击功能。 $scope.displayMessage 是在控制器设置期间定义的,它设置为空字符串:

$scope.onClick = function (itemId) {
    $scope.displayMessage = itemId;
}

如果我需要添加更多代码,请告诉我。

如果您在每个项目上都有属性要关闭,这对您来说会更容易完成。

例如,

$scope.items = [
  {
    id: 1,
    title: "first item",
    isFirstDivSelected: false,
    isSecondDivSelected: false
   },
  {
    id: 2,
    title: "second item",
    isFirstDivSelected: false,
    isSecondDivSelected: false
   }
  {
    id: 3,
    title: "third item",
    isFirstDivSelected: false,
    isSecondDivSelected: false
   }
];

这将允许您向您的子项添加 ng-click。

<div class="col-md-12 col-sm-12 col-xs-12  " ng-repeat="item in items track by item.id"  ng-click="onClick(item.id)">

  //first type div that is clickable
  <div class="row" ng-click="item.isFirstDivSelected = true;">
    <div>
      <header class="text">
        <h1 data-ng-if="item.title" ng-bind-html="item.title"></h1>
      </header>
    </div>
  </div>

  //div to be displayed after associated first div is clicked 
  <div class=" col-sm-11 row"  ng-show="item.isFirstDivSelected"   >
      <header class="col-sm-12 text">
          <h1  data-ng-if="item.title" ng-bind-html="item.title"></h1>
      </header>
      <p class="col-sm-12" > text about {{item.id]} </p>
  </div>
  
   //more divs.........

现在,没有好的方法可以让您的应用程序知道您的任何子 div 已被单击。还有其他方法可以做到这一点,但在我看来,添加定义明确且简单明了的属性是最好的方法。

可以通过更简单的方式完成,而无需将 属性 添加到范围内的 items 变量。

让控制器成为

app.controller('MainCtrl', function($scope) {
  $scope.div_=[]; 

  $scope.items = [
  {
    id: 1,
    title: "first item"
   },
  {
    id: 2,
    title: "second item",
   },
  {
    id: 3,
    title: "third item",
   }
];

  $scope.onClick=function(index,row){
     $scope.div_[index+'_'+row]=true;
   }
  });

HTML 会像

<body ng-controller="MainCtrl">
    <div ng-repeat="item in items">
    <div style="color:red" ng-click="onClick($index,0)">DIV {{$index}}.0---click to show DIV {{$index}}.0_CHILD</div>
    <div style="color:blue" ng-show="div_[$index+'_0']">DIV {{$index}}.0_CLILD</div>
    <br>
    <div style="color:red" ng-click="onClick($index,1)">DIV {{$index}}.1---click to show DIV {{$index}}.1_CHILD</div>
    <div style="color:blue" ng-show="div_[$index+'_1']">DIV {{$index}}.1_CLILD</div>
    <hr>
    </div>
  </body>

这里维护了一个名为 'div_' 的数组来跟踪所有 div.

的所有 ng-show 值

工作的 plunker https://plnkr.co/edit/uhFdCXkmS4gB95c9bjTR?p=preview

如果你想在循环下显示隐藏行

<div *ngFor="let client_obj of dashboard_data.data.items ;let i = index"    >
      <input type="checkbox"   [(ngModel)]="div_['level_1_'+i]">
          <div [class.hide]="div_['level_1_'+i]"   >
             {{client_obj.value}}
        </div>
 </div>