javascript - 无法点击关闭 AngularJS 中的 Accordion

标签 javascript jquery angularjs twitter-bootstrap pug

由于“div”和“td”,我无法使用 Bootstrap 或 JQuery Accordion ,所以目前我通过一些 AngularJS 有一个 Accordion ,它是:

$scope.viewMeasures = function($event) {
  var log = $($($event.target)[0]).closest('tbody');
  $('tbody.measure.selected').hide();
  $('tbody.selected').removeClass('selected');
  $(log).addClass('selected');
  $(log).next('tbody').fadeIn(20);
  $(log).next('tbody').addClass('selected');
} 

这允许我打开 Accordion 但不能关闭。有什么建议吗?

这也是我的 Jade 供引用:

body.log(ng-repeat-start="log in logs | orderBy : ['date_created'] : true")
    tr.log(ng-click="viewMeasures($event)", id='{{log._id}}')
      td 
        strong {{log.date_created | date:'MM-dd-yyyy'}}
      td 
        span.static
          strong {{log.name}}
        input.editable.form-control(ng-model='log.name')
      td
        strong {{log.updated_by}}

最佳答案

在 Controller 中处理 DOM 并不是一个好的做法。 如果您想向元素添加行为,请使用指令。

我通常采取的方法是首先查找已经具有我需要的行为的 HTML 元素。否则我会寻找现有的指令或模块(例如 ngmodules.org )。如果我找不到任何东西,我会获取在功能方面能找到的最接近的元素并对其进行增强。

就你而言,我会考虑使用 <summary> <details> 。为了产生 Accordion 效果(当另一个打开时折叠一个),我创建一个名为 group 的指令。 (或类似的东西)将聚合所有 <summary>标签 [group] .

检查this JSBin出来。

angular.module('gtDetailsGroup', []).
directive('gtGroup', function () {
  var groups = {};

  var directive = { restrict: 'A' };

  directive.compile = function compile (tElement, tAttrs) {
    if (!isDetails(tElement)) return;

    var group = tAttrs.gtGroup;
    (groups[group] || (groups[group] = [])).push(tElement);

    return link;
  };

  function isDetails (element) {
    return element.prop('tagName') === 'DETAILS';
  }

  function link ($scope, iElement, iAttrs) {
    var group = iAttrs.gtGroup;
    iElement.on('click', function () {
      groups[group].filter(function (element) {
        return iElement[0] !== element[0];
      }).forEach(function (element) {
        element.removeAttr('open');
      });
    });    
  }

  return directive;
});

在您的应用中,包含 gtDetailsGroup作为依赖。示例:

angular.module('MyApp', ['gtDetailsGroup']);

并像这样使用它:

<details gt:group="metrics">...</details>
<details gt:group="metrics">...</details>
<details gt:group="metrics">...</details>

这三个细节将表现得像 Accordion 。当其中一个打开时,其他的就会关闭。

关于javascript - 无法点击关闭 AngularJS 中的 Accordion ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24192411/

相关文章:

javascript - 使用 Bootstrap 将 JSON 文件加载到表中

javascript - 数据显示后ExtJS::Grid的事件?

javascript - jsp中的动态重力列表

jquery - 设置 ListView 的样式以隐藏 jquery mobile ListView 中元素之间的小间隙

javascript - 将 Razor 变量传递给 JavaScript 函数

javascript - jquery 更新边框颜色而不覆盖 border-left-color

javascript - 创建可重用的模态对象/模板系统

javascript - 等待 Youtube 评论加载然后运行函数

javascript - 安装 Angular cli 时出错

javascript - 从 Directive AngularJS 调用 Controller 函数