处理放置在选项卡内的引导手风琴的展开事件



我已经使用Angular Bootstrap在选项卡中放置了手风琴,但我无法处理手风琴窗格的展开事件。这是小提琴:http://jsfiddle.net/vruqw9s8/

$(function () {
$('accordion').on('show.bs.collapse', function () {
alert('accordion change');
});
});

更新的Fiddle

UI引导手风琴组指令上的is-open属性指向一个可绑定的表达式。表达式必须是布尔值,解析为truefalse。如果该值为true,则手风琴组将打开。

is-open属性是双向绑定,这意味着每当父作用域属性更改时,手风琴组的相应隔离作用域属性也会更改,反之亦然。因此,您可以使用$watch功能来监控手风琴是打开还是关闭。

因此,为了让你的Fiddle演示发挥作用,你需要做几件事:

  1. 将is-open属性绑定到控制器中的作用域属性
  2. 请确保scope属性为true或false
  3. 为scope属性创建$watch()

将is-open属性绑定到控制器中的作用域属性非常简单。在本例中,我只是创建了$scope.status作为一个具有一个名为open的属性的对象,并给它一个值false。这个值只是初始值,这样当您第一次运行演示时手风琴就关闭了。这里重要的是状态必须是对象,因为双向绑定就是这样工作的。如果您将状态设为字符串(例如,$scope.status = true),并且绑定对标记中的状态(即,is-open="status")开放,则它将仅为一个绑定。在这种情况下,它将把手风琴组初始化为打开,但当你点击元素打开和关闭它时,它不会更新范围

所以,你的控制器,这个部分,你会有:

$scope.status = {
open: false
};

在你的标记中,你会有:

<accordion-group heading="Accordion 2" is-open="status.open">
Accordian 2 content.
</accordion-group>

现在最后一部分是$watch函数。$watch函数有几个关键部分。首先,你必须告诉它要看什么,所以在这种情况下,你会通过status.open。这就是我们想要监控的范围,看看它是否发生了变化。接下来是监听器函数。

有两个值总是传递给侦听器函数。第一个是你正在观看的东西的新价值。第二个是你正在观看的东西的旧价值观。这些论点的顺序在这里很重要。不管你怎么称呼它,第一个值总是新的值。所以,现在这个$watch功能应该有意义了:

$scope.$watch('status.open', function(newval, oldval){
if(oldval !== newval) {
var state = newval ? 'opening' : 'closing';
alert('Accordion 2 is '+state);
}
});

在if语句中,我通过比较旧值和新值来检查status.open的值是否真的发生了变化。如果旧的和新的价值观不相等,那么你可以做你自己的事情。在这种情况下,我创建了一个名为state的变量,并使用三元运算符来检查新值,如果它为true,我将state的值设置为"opening",如果不是,则将其设置为"closeing"。然后,我就发出警报。

这已经太长了,所以我只想提到$watch函数中的第三个值,即对象相等。Ben Nadel有一个很棒的(短的)小实验视频,解释了如何以及何时使用对象相等。我还为您创建了这个Plunker,它展示了如何对动态创建的手风琴组使用这种深度值检查。

希望这能帮助你解决挑战。

最新更新