Angular:为什么我的div不是showing/hiding而ng-show/ng-hide?

Angular: Why is my div not showing/hiding with ng-show/ng-hide?

我正在尝试为一些图片制作一个超级简单的灯箱。基本上我有一个 div,其中包含一组使用 ng-repeat 显示的图像,我希望在单击其中一个图像时显示一个灯箱 div。我不明白为什么我的灯箱 div 不会出现。这是我的代码:

angular.module('myApp')
.controller('PhotosCtrl', ['$scope', function PhotosCtrl($scope){
 $scope.photos = [
  {
   src: '/images/img1.png',
   caption: ' '
  },
  {
   src: '/images/img2.png',
   caption: ' '
  }
 ];
 $scope.larges = [
  {
   src: '/images/img1-lg.png',
   caption: ' '
  },
  {
   src: '/images/img2-lg.png',
   caption: ' '
  }
 ];
}]);
.photowrap{
 max-width: 85%;
 margin: 0 auto;
 padding: 12px 0;
 display: flex;
 flex-flow: row wrap;
 justify-content: center;
 background-color: #fff;
}
.photos{
 margin: 0;
}
.photo{
 max-height: 250px;
 border: 2px solid #EBEBEB;
 border-radius: 5px;
}
p.caption{
 display: none;
}

.lightbox{
 max-width: 85%;
 margin: 0 auto;
 background-color: rgba(255,255,255,0.6);
 position: absolute;
}
.lbphoto{
 max-width: 100%;
 max-height: 100%;
 display: block;
 margin: 0 auto;
}
<div ng-controller="PhotosCtrl" class="content">
  <div class="photowrap">
    <a href="" ng-repeat="photo in photos" ng-click="showme=true" class="photos">
      <img ng-src="{{photo.src}}" class="photo img-responsive"/>
    </a>
    <div ng-show="showme" class="lightbox">
      <a href="" ng-repeat="large in larges" class="photos">
        <a ng-click="showme=false" class="close">x</a>
        <img ng-src="{{large.src}}" class="lbphoto img-responsive"/>
      </a>
    </div>
  </div>
</div>

谁能帮我弄清楚我做错了什么?

谢谢!

因为在每次迭代中 ng-repeat 确实会创建一个原型继承的子作用域。因此,在创建子作用域时,object 值通过子作用域内的引用传递,但原始类型值只是传递初始值。当基本类型值(此处为 showme)在子范围内被修改时,该变量在子范围内创建一个新副本(当内部 ng-repeatng-click 更改 [=13= 的值时] 它将是 showme) 的新变量副本。您可以通过参考类型 objects.

的帮助来解决此类问题

这里你可以做的是,将 showme 属性 作为外部 ng-repeat 的一部分,其中 photo 元素。通过它您将确保您依赖参考 objectphoto.

你还必须将 ng-repeat 移动到上面的一步,这样 photo 对象将在 inner ng-repeat 中可用,目前 ng-repeat 同级。

标记

<div ng-controller="PhotosCtrl" class="content">
  <div class="photowrap" ng-repeat="photo in photos">
    <a href="" ng-click="photo.showme=true" class="photos">
      <img ng-src="{{photo.src}}" class="photo img-responsive"/>
    </a>
    <div ng-show="photo.showme" class="lightbox">
      <a href="" ng-repeat="large in larges" class="photos">
        <a ng-click="photo.showme=false" class="close">x</a>
        <img ng-src="{{large.src}}" class="lbphoto img-responsive"/>
      </a>
    </div>
  </div>
</div>

您的代码有两个问题:

1- ng-repeat 创建一个子作用域,因此您必须使用 . 语法来设置变量并在以后使用它。

2- 你的 ng-repeata 标签上,因为你的 ng-show 在下面的 div 上,这意味着照片在那里不可用。您必须将 ng-repeat 提高一级。

所以:

<div ng-controller="PhotosCtrl" class="content">
  <div class="photowrap" ng-repeat="photo in photos">
    <a href="" ng-click="photo.showme=true" class="photos">
      <img ng-src="{{photo.src}}" class="photo img-responsive"/>
    </a>
    <div ng-show="photo.showme" class="lightbox">
      <a href="" ng-repeat="large in larges" class="photos">
        <a ng-click="photo.showme=false" class="close">x</a>
        <img ng-src="{{large.src}}" class="lbphoto img-responsive"/>
      </a>
    </div>
  </div>
</div>