UI Bootstrap for Angular 带有 'collapse' 指令,不调用 expand
UI Bootstrap for Angular with 'collapse' directive not calling expandDone()
我正在一个项目中使用 UI Bootstrap for Angular (http://angular-ui.github.io/bootstrap/),并且我创建了一个指令,该指令包装了 UI Bootstrap 中的 collapse
指令,如下所示:
app.directive( 'arSection', ['$timeout', function($timeout) {
return {
template: '<div class="section" ng-class="{''collapsed'': collapsed, ''open'': !collapsed}">' +
' <h4 ng-click="toggleCollapsed()">' +
' <span class="dropdown-ctrl" ng-class="{''icon-chevron-right'': collapsed, ''icon-chevron-down'': !collapsed}"></span>{{title}}' +
' </h4>' +
' <div collapse="collapsed" class="section-content">' +
' <div ng-transclude></div>' +
' <div class="clear"></div>' +
' </div>' +
'</div>',
restrict: 'E',
scope: true,
transclude: true,
replace: true,
link: function( scope, elem, attrs ){
scope.title = attrs.title;
// Toggle the open/closed state and save it away
scope.toggleCollapsed = function() {
scope.collapsed = !scope.collapsed;
};
scope.collapsed = true;
}
}
};
} ] );
这主要有效,因为单击 h4
元素会导致其下方的div
展开和折叠,但是,当展开div
时,UI Bootstrap 中的 expandDone()
方法(见下文)在动画完成时不会被调用。
function expandDone() {
element.removeClass('collapsing');
element.addClass('collapse in');
element.css({height: 'auto'});
}
这意味着height: auto
永远不会在我的div 上设置,因此当我的内容增长时,div 不会增长,并且某些内容会被切断。
collapseDone()
方法在折叠时也永远不会被调用。
现在,如果我单击应用程序中的另一个元素(arSection 外部),则会调用collapseDone()
和expandDone()
方法!
似乎它们排队等待运行,但据我了解,这些方法仅在 collapse
指令发生应用/摘要时调用。 单击另一个组件似乎间接触发了到达 collapse 指令的应用/摘要,因此最终进行了排队的回调,但为时已晚。
我不明白的是如何在动画完成后立即触发应用/摘要,以便在正确的时间调用collapseDone()
和expandDone()
。
我猜它与 Angular 示波器或手表有关,但无法完全看到我缺少的链接。
更新:我已经用这个arSection
指令组装了一个 Plunker,但它按预期工作。 单击"第一部分"标题以动画方式将其打开。 然后单击内容以使其变大。 第二部分标题向下移动。 不过,在我的实际项目中,即使第一部分的内容变大,第二部分的标题也会保留在原处。 更大的内容被切断了。
如果在 HTML 运行时检查它,您可以看到"折叠"类在动画化时被添加和删除到div 中。 "折叠"类确实被添加到我的实际代码中,但它不会被删除(至少在我单击触发应用/摘要的某个地方之前不会)。
我认为Angular UI的手风琴是一个很好的用例,但是,为了学习,这里有一些工作: Plunker
使用 ng-init 和 ng-click,您可以避免大量的逻辑和编码。此处不需要控制器逻辑/指令
<div class="container" ng-controller="CollapseDemoCtrl">
<h3>Click the section headers to expand them</h3>
<hr>
<div class="col-md-12">
<h3 class="" ng-init="showContentOne=false" ng-click="showContentOne= !showContentOne">
<i ng-class="showContentOne ? 'fa fa-angle-down' : 'fa fa-angle-right'"></i> Show Content One</h3>
<div ng-show="showContentOne" class="well well-lg" ><h5>Tons of content one</h5></div>
</div>
<div class="col-md-12">
<h3 class="" ng-init="showContentTwo=false" ng-click="showContentTwo=!showContentTwo">
<i ng-class="showContentTwo ? 'fa fa-angle-down' : 'fa fa-angle-right'"></i> Show Content Two</h3>
<div ng-show="showContentTwo" class="well well-lg" ><h5>Content!!</h5></div>
</div>
</div>
我在调查了为什么我的手风琴没有自动调整大小以适应动态内容之后来到这里.我正在深入研究指令,并注意到,像你一样,expandDone()
没有被召唤。
我通过安装 ngAnimate 并将其添加为依赖项来解决此问题:
angular.module('app', ['ngAnimate']);
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- D3在一个调用中绘制不同的SVG形状,没有可见性
- 如何从Java/scala调用js美化程序
- 如何调用这个匿名 JavaScript 函数
- 如何从模块链中调用函数.导出到节点中
- 我需要从php调用javascript或jquery
- Chrome开发工具(如何知道我在调用哪个javascript对象)
- 单击按钮后如何逐个调用分区,上一个分区将隐藏
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- Twitter Bootstrap typeahead:使用“this”获取上下文/调用元素
- node.js:setInterval()正在跳过调用
- 如何在单击复选框后调用控制器方法
- 如何在JQuery函数中定义一个值,然后调用另一个函数并使用该值
- 使用Google Visualization动态调用构造函数
- 如何在webView,Android中从@JavascriptInterface方法调用Javascript
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 调用函数内部的函数
- 函数未在Object.keys或Object.getOwnPropertyNames下列出,但可以调用
- Javascript/jQuery中的并行Ajax调用
- UI Bootstrap for Angular 带有 'collapse' 指令,不调用 expand