使用AngularJS展开和折叠

vbkedwbf  于 2022-11-21  发布在  Angular
关注(0)|答案(6)|浏览(200)

我试图找到一种方法来使用AngularJS进行展开和折叠。我还没有找到一种优雅的方法来完成这项工作,而不需要在控制器中操作DOM对象(这不是Angular的方法)。
目前我有一个很好的方法来做一个层展开和折叠。但是当我开始嵌套时,事情变得复杂了,并且没有按照我想要的方式工作(展开和折叠多个区域,当它们不应该的时候)。
问题是我不知道如何发送一个唯一的标识符与ng-click只展开/折叠正确的内容。我应该提一下,这些项目是在一个ng-repeat,所以我必须自定义参数发送。
我可以使用这个jsfiddle来帮助我得到一个层展开和折叠的工作。然而这是一个切换的方式来做它,我希望用户能够保持东西展开,同时展开其他的东西。所以我所做的修复这个问题是使用一个数组,每次点击某个东西,点击的项目的索引将被添加到数组和类展开。当使用者再次按一下时,索引会从数组中移除,且区域会收合。
另一种方法是使用指令。但是我找不到任何例子来解释指令是如何工作的。我甚至不知道如何开始编写指令。
我目前的设定如下:

function Dexspander($scope) {
    $scope.ExpandArray = [];

    //Push or pop necessary elements for tracking
    $scope.DespopulatArray = function (identifier, element) {
    if (_.indexOf($scope.ExpandArray, identifier + element) != -1) {
            $scope.ExpandArray.splice(_.indexOf($scope.ExpandArray, identifier + element), 1);
        } else {
            $scope.ExpandArray.push(identifier + element);
        }
    }

    //Change class of necessary elements
    $scope.Dexspand = function (identifier, element) {
        if (_.indexOf($scope.ExpandArray, identifier + element) != -1) {
            return "expand";
        } else {
            return "collapse";
        }
    }
}

<div class="user-header" ng-repeat="user in users">
    <h1 ng-click="DespopulatArray('user', $index)">Expand</h1>
</div>
<div class="user-content" ng:class="Dexspand('user', $index)">
    <div class="content">
        <div class="user-information">
            <div class="info-header">
                <h1 ng-click="DespopulatArray('info', $index)>Some Information</h1>
            </div>
            <div class="info-contents" ng:class="Dexspand('info', $index)">
                stuff stuff stuff stuff...
            </div>
        </div>
    </div>
</div>

这个设置的问题是,如果我必须将div扩展为父级,并且这两个div下都有要扩展的内容,则单击扩展文本将在这两个区域中扩展它们,因为它们不是唯一的。

vxbzzdmp

vxbzzdmp1#

您可以在html中完全解决这个问题:

<div>
  <input ng-model=collapse type=checkbox>Title
  <div ng-show=collapse>
     Only shown when checkbox is clicked
  </div>
</div>

这也适用于ng-repeat,因为它将为每个成员创建一个本地作用域。

<table>
  <tbody ng-repeat='m in members'>
    <tr>
       <td><input type=checkbox ng-model=collapse></td>
       <td>{{m.title}}</td>
    </tr>
    <tr ng-show=collapse>
      <td> </td>
      <td>{{ m.content }}</td>
    </tr>
  </tbody>
</table>

请注意,即使repeat有自己的作用域,最初它也会从超级作用域继承collapse的值。这允许您在一个位置设置初始值,但可能会令人惊讶。
当然,您可以重新设置复选框的样式。

更新的fiddle:http://jsfiddle.net/azD5m/374/原始的fiddle使用结束</input>标签来添加HTML文本标签,而不是使用<label>标签。

cyvaqqii

cyvaqqii2#

问题来了,我不知道如何发送一个唯一的标识符与ng-click只展开/折叠正确的内容。
您可以使用ng-click传递$event(ng-dblclick和ng- mouse事件),然后您就可以判断是哪个元素造成事件:

<a ng-click="doSomething($event)">do something</a>

控制器:

$scope.doSomething = function(ev) {
    var element = ev.srcElement ? ev.srcElement : ev.target;
    console.log(element, angular.element(element))
    ...
}

另请参阅http://angular-ui.github.com/bootstrap/#/accordion

hsvhsicv

hsvhsicv3#

请访问http://angular-ui.github.io/bootstrap/#/collapse

function CollapseDemoCtrl($scope) {
  $scope.isCollapsed = false;
}


<div ng-controller="CollapseDemoCtrl">
    <button class="btn" ng-click="isCollapsed = !isCollapsed">Toggle collapse</button>
    <hr>
    <div collapse="isCollapsed">
        <div class="well well-large">Some content</div> 
    </div>
</div>
pengsaosao

pengsaosao4#

我刚刚用ng-show,ng-click和ng-init写了一个简单的zippy/collapsable,它只实现了一个层次,但可以很容易地扩展到多个层次。
为ng-show分配一个布尔变量,并在单击标题时切换它。
快来看看

rwqw0loc

rwqw0loc5#

这里有一个简单而容易的解决方案,在Angular JS使用ng-repeat,可能会有所帮助。
第一个
这应该能满足你的要求。这是一个工作代码。
活塞连杆http://plnkr.co/edit/n5DZxluYHi8FI3OmzFq2?p=preview
Github:https://github.com/deepakkoirala/SimpleAngularCollapse

uurity8g

uurity8g6#

HTML格式

button ng-click="myMethod()">Videos</button>

在角

$scope.myMethod = function () {
         $(".collapse").collapse('hide');    //if you want to hide
         $(".collapse").collapse('toggle');  //if you want toggle
         $(".collapse").collapse('show');    //if you want to show
}

相关问题