处理Angular中Accordion的开放/崩溃事件

Mic*_*hal 40 javascript twitter-bootstrap angularjs angular-ui

如果我有这个代码:

<accordion-group heading="{{group.title}}" ng-repeat="group in groups">
      {{group.content}}
</accordion-group>
Run Code Online (Sandbox Code Playgroud)

使用AngularJS,angular-ui和Twitter Bootstrap,是否可以在打开时让手风琴调用一些动作?我知道我不能简单地添加ng-click,因为它已经被"编译"为HTML以用于打开/折叠组.

kjv*_*kjv 32

手风琴组还允许使用手风琴标题指令,而不是将其作为属性提供.您可以使用它,然后使用ng-click将标题包装在另一个标记中.

<accordion-group ng-repeat="group in groups" heading="{{group.title}}" is-open="group.open">
  <accordion-heading>
    <span ng-click="opened(group, $index)">{{group.content}}</span>
  </accordion-heading>
</accordion-group>
Run Code Online (Sandbox Code Playgroud)

示例:http://plnkr.co/edit/B3LC1X?p = preview

  • 这很好,唯一的问题是手风琴标题占据了整行,只有直接点击文本时才会调用打开的函数 (5认同)
  • 是的,手风琴标题允许我们在点击时打开或关闭面板,但这不是揭示如何从其他触发器打开面板的示例. (3认同)

Kho*_*ort 29

这是基于pkozlowski.opensource解决方案的解决方案.您可以使用动态定义的Property,
而不是在集合的每个项目上添加$ watch.在这里,你可以将绑定IsOpened的财产IS-打开属性.

<accordion-group ng-repeat="group in groups" heading="{{group.title}}" is-open="group.IsOpened">
   {{group.content}}
</accordion-group>
Run Code Online (Sandbox Code Playgroud)

因此,您可以在控制器中的集合的每个项目上动态添加IsOpened属性:

$scope.groups.forEach(function(item) {
  var isOpened = false;
  Object.defineProperty(item, "IsOpened", {
    get: function() {
      return isOpened;
    },
    set: function(newValue) {
      isOpened = newValue;
      if (isOpened) {
        console.log(item); // do something...
      }
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

使用属性而不是手表更适合表演.

  • 我知道,所以基本上不鼓励*OMG谢谢你,谢谢你们.所以,让我说,如果我遇到你,我会给你买啤酒;)这是一个很好的解决方案,而不是手表的开销. (3认同)
  • 这实际上是目前最好的答案. (3认同)

pko*_*rce 24

is-openaccordion-group上有一个属性,它指向一个可绑定的表达式.当给定的手风琴组打开时,您可以观看此表达式并执行某些逻辑.使用此技术,您可以将标记更改为:

<accordion-group ng-repeat="group in groups" heading="{{group.title}}" is-open="group.open">
   {{group.content}}
</accordion-group>
Run Code Online (Sandbox Code Playgroud)

这样您就可以在控制器中准备所需的监视表达式:

$scope.$watch('groups[0].open', function(isOpen){
    if (isOpen) {
      console.log('First group was opened'); 
    }    
  });
Run Code Online (Sandbox Code Playgroud)

虽然上述工作在实践中使用可能有点麻烦,所以如果你觉得这可以改进,请打开https://github.com/angular-ui/bootstrap中的问题

  • 我不敢相信这不容易做到.这是完全垃圾.当然,开发人员会想要观看一个开放组的手风琴以及它何时发生变化.这是微不足道的. (15认同)
  • 我可以让观看更通用吗?喜欢 - 所以我不必为每一行写''groups [0] .open'.我事先不知道有多少行...... (2认同)