在角度控制器中注册引导事件处理程序

Posted

技术标签:

【中文标题】在角度控制器中注册引导事件处理程序【英文标题】:Registering a bootstrap event handler in angular controller 【发布时间】:2014-06-12 12:42:52 【问题描述】:

我是 Angular 和 javascript(有点)的新手,我正在尝试弄清楚如何将处理程序注册到我的控制器中的引导事件。

我想做这样的事情:

$('#mymodal').on('shown.bs.modal', function () 
   $scope.password = undefined;
);

首先,我无法让 jQuery 在我的控制器中运行。根据我的研究,我感觉不建议这样做。这是真的?同样出于教育目的,如果我愿意,如何让 jQuery 在我的控制器中运行?

其次,我写了以下代码来代替 jQuery:

var modal = document.getElementById("mymodal");
modal.addEventListener('shown.bs.modal', function () 
  $scope.password = undefined;
, false);

这也行不通。我认为'shown.bs.modal' 还没有被“检测到”。任何想法为什么?

我需要require bootstrap.js 文件来解决这个问题吗?

【问题讨论】:

【参考方案1】:

看到这个plunker。

根据我的研究,我感觉不建议这样做。是 这是真的?也出于教育目的,我怎样才能让 jQuery 运行 如果我愿意,在我的控制器中?

是的,通常不建议在您的 Angular 应用程序中使用 jQuery,通常也没有必要。但是,如果您想使用它,您可以在包含 Angular 库之前简单地包含它(上面链接的 plunker 会这样做)。在这种情况下,Angular 的 jQuery (jqlite) 版本不支持在其 on() 事件注册方法中的名称空间,因此如果要使用引导程序,您可能需要使用 jQuery;但是,您可以改用 ui-bootstrap(角度版本的 bootstrap)(见下文)。

这也行不通。我认为'shown.bs.modal'不是 “检测到”至今。任何想法为什么?

我需要 bootstrap.js 文件来解决这个问题吗?

是的,您将需要 bootstrap.js。这是plunker的摘录:

标题包括:

<head>
  <script data-require="jquery@*" data-semver="2.0.3" src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
  <script data-require="bootstrap@*" data-semver="3.1.1" src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
  <script data-require="angular.js@*" data-semver="1.3.0-beta.5" src="https://code.angularjs.org/1.3.0-beta.5/angular.js"></script>
  <link data-require="bootstrap-css@3.1.1" data-semver="3.1.1" rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" />
</head>

JavaScript:

<script>
  var app = angular.module('myapp', []);
  app.controller('mycontroller', function($scope, $timeout)
    $scope.test = 'Hello World!';
    $('#myModal').on('show.bs.modal', function (e) 
      $timeout(function()
        $scope.test = 'Model has been opened!';  
      );
    )
  );
</script>

但是,如果您只是想在每次打开模式时重置密码字段,这里有一种使用 ui-bootstrap 更简单、更有角度的方法。你可以查看完整的plunkerhere:

  var app = angular.module('myApp', ['ui.bootstrap']);
  app.controller('myController', function($scope, $modal)
    $scope.test = 'Hello World!';
    $scope.openPopup = function()
      $modal.open(
        templateUrl: "popup.html",
        controller: "myModalController",
        resolve: 
          form: function() 
            return 
              username: 'default_username',
              password: 'default_password',
            
          
        
      );
    
  );
  app.controller('myModalController', function($scope, $modalInstance, form)
    $scope.form = form;
    $scope.close = function()
      $modalInstance.dismiss('cancel');
    
  );

【讨论】:

找不到更好的解释。谢谢!

以上是关于在角度控制器中注册引导事件处理程序的主要内容,如果未能解决你的问题,请参考以下文章

EXTJS,无法将事件处理程序绑定到控制器

角度单击事件处理程序未触发更改检测

Jquery Mobile Swipe 事件未触发

用于反应引导 DropDown 的 onSelect 事件处理程序打字稿类型

注册 asp:button 点击​​事件处理程序

从角度 ui 引导模式中单击时如何捕获背景单击事件?