我试图找出一种使用角度js进行展开和折叠的方法。如果不操纵控制器中的dom对象(这不是角度方式),我无法找到一种优雅的方法。目前我有一个很好的方法来进行一层扩展和折叠。然而,当我开始嵌套时,事情变得复杂并且不能按照我想要的方式工作(当它们不应该扩展和折叠多个区域时)。我不知道如何通过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,并且两者都有扩展的内容,单击展开文本将在两个区域展开它们,因为它们不是唯一的。
答案 0 :(得分:27)
你可以在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>
请注意,即使重复有自己的范围,最初它将从超范围继承崩溃的值。这允许您在一个地方设置初始值,但这可能会令人惊讶。
你当然可以重新选择复选框。见http://jsfiddle.net/azD5m/5/
更新了小提琴: http://jsfiddle.net/azD5m/374/原始小提琴使用关闭</input>
标签来添加HTML文本标签,而不是使用<label>
标签。
答案 1 :(得分:16)
问题在于我不知道如何通过ng-click发送唯一标识符,只展开/折叠正确的内容。
您可以通过ng-click(ng-dblclick和ng-mouse事件)传递$event
,然后您可以确定导致该事件的元素:
<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))
...
}
答案 2 :(得分:7)
请参阅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>
答案 3 :(得分:3)
我刚刚使用ng-show,ng-click和ng-init使用Angular编写了一个简单的zippy / collapsable。它实现了一个级别,但可以轻松扩展到多个级别。
为ng-show分配一个布尔变量,并在点击标题时切换它。
查看here
答案 4 :(得分:2)
这里有一个简单易用的解决方案,使用ng-repeat可能对Angular JS有所帮助。
var app = angular.module('myapp', []);
app.controller('MainCtrl', function($scope) {
$scope.arr= [
{name:"Head1",desc:"Head1Desc"},
{name:"Head2",desc:"Head2Desc"},
{name:"Head3",desc:"Head3Desc"},
{name:"Head4",desc:"Head4Desc"}
];
$scope.collapseIt = function(id){
$scope.collapseId = ($scope.collapseId==id)?-1:id;
}
});
&#13;
/* Put your css in here */
li {
list-style:none;
padding:5px;
color:red;
}
div{
padding:10px;
background:#ddd;
}
&#13;
<!DOCTYPE html>
<html ng-app="myapp">
<head>
<meta charset="utf-8" />
<title>AngularJS Simple Collapse</title>
<script data-require="angular.js@1.5.x" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.11/angular.min.js" data-semver="1.5.11"></script>
</head>
<body ng-controller="MainCtrl">
<ul>
<li ng-repeat='ret in arr track by $index'>
<div ng-click="collapseIt($index)">{{ret.name}}</div>
<div ng-if="collapseId==$index">
{{ret.desc}}
</div>
</li>
</ul>
</body>
</html>
&#13;
这应该符合您的要求。这是一个有效的代码。
Plunkr Link http://plnkr.co/edit/n5DZxluYHi8FI3OmzFq2?p=preview
Github:https://github.com/deepakkoirala/SimpleAngularCollapse
答案 5 :(得分:-1)
在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
}