草庐IT

javascript - 未检测到 Bootstrap 崩溃事件 hidden.bs.collapse

coder 2025-02-09 原文

我有一个使用引导折叠元素的 Angular 应用程序。 我创建了一个名为 accordion-list 的指令,用于托管可折叠元素。 然后,为了收听事件,我使用了 jquery 事件委托(delegate)。 出于某种原因,我的应用程序无法检测到 Bootstrap 何时触发 hidden.bs.collapse事件。 这是我的代码:

//app.js
    'use strict';

(function () {
    var provasNaoIdentificadas = angular.module("provasNaoIdentificadas", [
        'restClient'
    ]);

    provasNaoIdentificadas.controller("accordionCtrl", ["$scope", "ListaInscricao", function($scope, ListaInscricao){
        $scope.inscricao = {
            "Secretaria": ""
        };

        $("accordion-list").on("hidden.bs.collapse shown.bs.collapse", ".collapse", function (event) {
            if ($(this).hasClass("in")) {
                $(this).prev().find(".glyphicon").removeClass("glyphicon-plus glyphicon-minus").addClass("glyphicon-minus");
                $(this).prev().find("span.pull-right.text-muted").removeClass("expandir fechar").addClass("fechar");
            } else {
                $(this).prev().find(".glyphicon").removeClass("glyphicon-plus glyphicon-minus").addClass("glyphicon-plus");
                $(this).prev().find("span.pull-right.text-muted").removeClass("expandir fechar").addClass("expandir");
            }

            console.log(1, this, event); // i have detected the problem by interpreting 
        });

        ListaInscricao.get({"id": 1}, function(data){
            if (data.Sucesso) {
                $scope.inscricao = data.Dados;
            } else {
                // toastr
            }
        });
    }]);

    provasNaoIdentificadas.directive('accordionList', function() {
        return {
            "restrict": "E",
            "templateUrl": "partials/accordion.html"
        };
    });
})();

帮助你们可以帮助我。提前致谢。 :)

编辑

这是我的文件:

index.html:

<!-- index.html -->
<!DOCTYPE html>
<html ng-app="provasNaoIdentificadas">
    <head>
        <title>Hábile: Inscrição De Escolas Públicas Para Provas Não Identificadas</title>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
        <link rel="stylesheet" href="css/vendor/bootstrap.min.css" />
        <script src="js/vendor/jquery-1.11.1.min.js"></script>
        <script src="js/vendor/bootstrap.min.js"></script>
        <script src="js/vendor/angular.min.js"></script>
        <script src="js/vendor/angular-resource.min.js"></script>
        <script src="js/app.js"></script>
        <script src="js/rest-client.js"></script>
        <style>
            .panel-heading {
                cursor: pointer;
            }

            .panel-heading .panel-title span.pull-right.text-muted {
                font-size: 10px;
            }

            .panel-heading .panel-title span.pull-right.text-muted.expandir:before {
                content: "clique para expandir";
            }

            .panel-heading .panel-title span.pull-right.text-muted.fechar:before {
                content: "clique para fechar";
            }
        </style>
    </head>
    <body>
        <div class="container">
            <div class="well text-justify">
                <h3>Formul&aacute;rio de Inscri&ccedil;&atilde;o H&aacute;bile 2014</h3>
            </div>
            <div ng-controller="accordionCtrl">
                <h2 id="nomeSecretaria">{{ inscricao.Secretaria }}</h2>
                <accordion-list></accordion-list>
            </div>
            <div class="text-center">
                <button type="button" class="btn btn-lg btn-primary">Salvar Inscrição</button>
                <button type="button" class="btn btn-lg btn-warning">Finalizar Inscrição</button>
            </div>
        </div>
    </body>
</html>

部分/accordion.html

<!-- partials/accordion.html -->
<div class="panel-group" id="accordion_escolas">
    <div class="panel panel-default" ng-repeat="escola in inscricao.Escolas">
        <div class="panel-heading" data-toggle="collapse" data-target="#escola{{ $index }}" data-parent="#accordion_escolas">
            <div class="panel-title">
                <span class="glyphicon glyphicon-plus"></span>
                {{ escola.Nome }} <span class="text-muted">x alunos inscritos</span>
                <span class="pull-right text-muted expandir"></span>
            </div>
        </div>
        <div id="escola{{ $index }}" class="panel-collapse collapse">
            <div class="panel-body">
                <p>
                    <label for="qtdProfessoresEscola{{ $index }}">Qtd. Professores</label><br />
                    <input class="form-control" type="text" id="qtdProfessoresEscola{{ $index }}}}" value="{{ escola.QtdProfessores }}" />
                </p>
                <div class="panel-group" id="accordion_escola{{ $index }}">
                    <div class="panel panel-default" ng-repeat="serie in escola.Series">
                        <div class="panel-heading" data-toggle="collapse" data-target="#turma_{{ $index }}_escola{{ $parent.$index }}" data-parent="#accordion_escola{{ $parent.$index }}">
                            <div class="panel-title">
                                <span class="glyphicon glyphicon-plus"></span>
                                {{ serie.Nome }} <span class="text-muted">y alunos inscritos</span>
                                <span class="pull-right text-muted expandir"></span>
                            </div>
                        </div>
                        <div id="turma_{{ $index }}_escola{{ $parent.$index }}" class="panel-collapse collapse">
                            <div class="panel-body">
                                <table class="table table-hover table-condensed table-bordered">
                                    <thead>
                                        <tr>
                                            <th>Turma</th>
                                            <th>Qtd Alunos</th>
                                            <th>Qtd Testes A3</th>
                                            <th>Alunos PCD</th>
                                            <th></th>
                                        </tr>
                                    </thead>
                                    <tbody>
                                        <tr ng-repeat="turma in serie.Turmas">
                                            <td>{{ turma.Nome }}</td>
                                            <td><input class="form-control" type="text" value="{{ turma.QtdAlunos }}" /></td>
                                            <td><input class="form-control" type="text" value="{{ turma.QtdTestesA3 }}" /></td>
                                            <td><input class="form-control" type="text" value="{{ turma.AlunosPCD }}" /></td>
                                            <td><button class="btn btn-primary btn-sm" type="button">Excluir Turma</button></td>
                                        </tr>
                                    </tbody>
                                </table>
                                <p>
                                    <button class="btn btn-primary" type="button">Adicionar Turma</button>
                                </p>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

js/app.js:

/* js/app.js */
'use strict';

(function () {
    var provasNaoIdentificadas = angular.module("provasNaoIdentificadas", [
        'restClient'
    ]);

    provasNaoIdentificadas.controller("accordionCtrl", ["$scope", "ListaInscricao", function($scope, ListaInscricao){
        $scope.inscricao = {
            "Secretaria": ""
        };

        $("accordion-list").on("hidden.bs.collapse shown.bs.collapse", ".collapse", function (event) {
            if ($(this).hasClass("in")) {
                $(this).prev().find(".glyphicon").removeClass("glyphicon-plus glyphicon-minus").addClass("glyphicon-minus");
                $(this).prev().find("span.pull-right.text-muted").removeClass("expandir fechar").addClass("fechar");
            } else {
                $(this).prev().find(".glyphicon").removeClass("glyphicon-plus glyphicon-minus").addClass("glyphicon-plus");
                $(this).prev().find("span.pull-right.text-muted").removeClass("expandir fechar").addClass("expandir");
            }

            console.log(1, this, event);
        });

        ListaInscricao.get({"id": 1}, function(data){
            if (data.Sucesso) {
                $scope.inscricao = data.Dados;
            } else {
                // toastr
            }
        });
    }]);

    provasNaoIdentificadas.directive('accordionList', function() {
        return {
            "restrict": "E",
            "templateUrl": "partials/accordion.html"
        };
    });
})();

js/rest-client.js:

/* js/rest-client.js */
'use strict';

(function(){
    var restClient = angular.module('restClient', ['ngResource']);

    restClient.factory('ListaInscricao', ['$resource', function ($resource) {
        return $resource('mock/lista_inscricao.json');
    }]);
})();

模拟/lista_inscricao.json:

{
    "Sucesso": true
    ,
    "Mensagem": ""
    ,
    "Dados": {
        "Secretaria": "Secretaria de Educação ABC"
        ,
        "Escolas": [
            {
                "Nome": "Escola 1"
                ,
                "QtdProfessores": 12
                ,
                "Series": [
                    {
                        "Nome": "1º Ano Ensino Médio"
                        ,
                        "Turmas": [
                            {
                                "Nome": "A"
                                ,
                                "QtdAlunos": 30
                                ,
                                "QtdTestesA3": 0
                                ,
                                "AlunosPCD": "27,29"
                            }
                            , {
                                "Nome": "B"
                                ,
                                "QtdAlunos": 28
                                ,
                                "QtdTestesA3": 2
                                ,
                                "AlunosPCD": ""
                            }
                        ]
                    }
                    ,
                    {
                        "Nome": "2º Ano Ensino Médio"
                        ,
                        "Turmas": [
                            {
                                "Nome": "A"
                                ,
                                "QtdAlunos": 25
                                ,
                                "QtdTestesA3": 1
                                ,
                                "AlunosPCD": "7"
                            }
                        ]
                    }
                ]
            }
            ,
            {
                "Nome": "Escola 2"
                ,
                "QtdProfessores": 10
                ,
                "Series": [
                    {
                        "Nome": "3º Ano Ensino Médio"
                        ,
                        "Turmas": [
                            {
                                "Nome": "A"
                                ,
                                "QtdAlunos": 30
                                ,
                                "QtdTestesA3": 0
                                ,
                                "AlunosPCD": "15,27"
                            }
                            , {
                                "Nome": "B"
                                ,
                                "QtdAlunos": 26
                                ,
                                "QtdTestesA3": 0
                                ,
                                "AlunosPCD": ""
                            }
                            , {
                                "Nome": "C"
                                ,
                                "QtdAlunos": 25
                                ,
                                "QtdTestesA3": 0
                                ,
                                "AlunosPCD": ""
                            }
                        ]
                    }
                ]
            }
        ]
    }
}

最佳答案

现在,我刚刚更改了我的事件监听器。由于某种原因,jquery 听不到 hidden.bs.collapse。我注意到点击事件不适合这种情况,因为如果你点击的速度足够快,你可以以关闭的 Accordion 和一个减号图标结束。所以,我将事件监听器更改为:

$(document).on("hide.bs.collapse show.bs.collapse", ".collapse", function (event) {
    $(this).prev().find(".glyphicon").toggleClass("glyphicon-plus glyphicon-minus");
    $(this).prev().find("span.pull-right.text-muted").toggleClass("expandir fechar");
    event.stopPropagation();
});

这工作得很好。但是,正如 bhantol 所说,这并不完全是 angularjs 的做事方式。解得好者得奖 xD

关于javascript - 未检测到 Bootstrap 崩溃事件 hidden.bs.collapse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26556880/

有关javascript - 未检测到 Bootstrap 崩溃事件 hidden.bs.collapse的更多相关文章

  1. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  2. ruby - 将 Bootstrap Less 添加到 Sinatra - 2

    我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它

  3. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  4. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  5. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  6. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  7. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  8. ruby-on-rails - 事件管理员和自定义方法 - 2

    这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什

  9. ruby-on-rails - 在不重新查询数据库的情况下重新排序 Rails 中的事件记录? - 2

    例如,假设我有一个名为Products的模型,并且在ProductsController中,我有以下代码用于product_listView以显示已排序的产品。@products=Product.order(params[:order_by])让我们想象一下,在product_listView中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常更改。我很难理解的是,每次用户选择新的order_by过滤器时,rails是否必须查询,或者rails是否能够以某种方式缓存事件记录以在服务器端重新排序?有没有一种方法可以编写它,以便在用户排序时rails不会重新查询结果

  10. ruby - 检测由 RSpec、Ruby 运行的代码 - 2

    我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题

随机推荐