首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用angular js展开和折叠

使用angular js展开和折叠
EN

Stack Overflow用户
提问于 2012-09-26 21:57:24
回答 6查看 128.4K关注 0票数 23

我正在尝试找出一种使用angular js进行展开和折叠的方法。如果不在控制器中操作dom对象(这不是angular方式),我还找不到一种优雅的方法来实现这一点。目前,我有一个很好的方法来实现单层展开和折叠。然而,当我开始嵌套时,事情变得复杂,并且不能按照我想要的方式工作(在不应该的时候展开和折叠多个区域)。问题来了,我不知道如何发送一个唯一的标识符与ng-click,以只展开/折叠正确的内容。我需要指出的是,这些项都在ng-repeat中,因此我可以定制发送的参数。

我能够使用这个jsfiddle来帮助我让单层展开和折叠工作。然而,这是一种切换方式,我希望用户能够在扩展其他内容的同时保持扩展。因此,我所做的是使用一个数组来解决这个问题,每次单击某个东西时,所单击的项的索引都会被添加到该数组中,类也会展开。当用户再次单击时,索引将从数组中移除,区域将折叠。

我发现的另一种方法是使用指令。但是我真的找不到任何例子来解释指令是如何工作的。当涉及到编写指令时,我甚至不确定如何开始。

我目前的设置是:

代码语言:javascript
复制
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>
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-01-13 02:00:55

问题是由于我不知道如何通过单击ng-click来发送唯一标识符来仅展开/折叠正确的内容而出现的。

您可以使用ng-click传递$event ( ng- dblclick和ng-鼠标事件),然后您可以确定哪个元素引发了事件:

代码语言:javascript
复制
<a ng-click="doSomething($event)">do something</a>

控制器:

代码语言:javascript
复制
$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

票数 16
EN

Stack Overflow用户

发布于 2014-01-13 00:04:17

你可以在html中完整地解决这个问题:

代码语言:javascript
复制
<div>
  <input ng-model=collapse type=checkbox>Title
  <div ng-show=collapse>
     Only shown when checkbox is clicked
  </div>
</div>

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

代码语言:javascript
复制
<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有自己的作用域,它最初也会从超级作用域中继承折叠的值。这允许您在一个地方设置初始值,但这可能会令人惊讶。

当然,您也可以重新定义复选框的样式。请参阅http://jsfiddle.net/azD5m/5/

更新小提琴: http://jsfiddle.net/azD5m/374/原始小提琴使用闭合</input>标签来添加HTML标签,而不是使用<label>标签。

票数 27
EN

Stack Overflow用户

发布于 2013-12-24 01:17:30

请参阅http://angular-ui.github.io/bootstrap/#/collapse

代码语言:javascript
复制
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>
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12603425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档