在angularjs中如何访问触发事件的元素?

我在我的web应用程序中同时使用Bootstrap和AngularJS。 两个人一起工作我有一些困难。

我有一个元素,它有属性data-provide="typeahead"

 <input id="searchText" ng-model="searchText" type="text" class="input-medium search-query" placeholder="title" data-provide="typeahead" ng-change="updateTypeahead()" /> 

我想在用户input字段时更新data-source属性。 函数updateTypeahead被正确触发,但我没有访问触发事件的元素,除非我使用$('#searchText') ,这是jQuery的方式,而不是AngularJS的方式。

让AngularJS使用旧式JS模块的最佳方式是什么?

  updateTypeahead(this) 

不会将DOM元素传递给函数updateTypeahead(this) 。 这里将涉及范围。 如果要访问DOM元素,请使用updateTypeahead($event) 。 在callback函数中,您可以通过event.target获取DOM元素。

请注意:ng-change函数不允许将$ event作为variables传递。

访问触发事件的元素的一般Angular方法是编写一个指令并bind()到所需的事件:

 app.directive('myChange', function() { return function(scope, element) { element.bind('change', function() { alert('change on ' + element); }); }; }); 

或与DDO(根据@ tpartee下面的评论):

 app.directive('myChange', function() { return { link: function link(scope, element) { element.bind('change', function() { alert('change on ' + element); }); } } }); 

上述指令可以使用如下:

 <input id="searchText" ng-model="searchText" type="text" my-change> 

Plunker 。

键入文本字段,然后离开/模糊。 更改callback函数将触发。 在callback函数中,你可以访问element

一些内置的指令支持传递一个$ event对象。 例如,ng- *点击,ng-Mouse *。 请注意,ng-change不支持这个事件。

虽然您可以通过$ event对象获取元素:

 <button ng-click="clickit($event)">Hello</button> $scope.clickit = function(e) { var elem = angular.element(e.srcElement); ... 

这是“反对angular度的方式” – 米斯科 。

你可以像这样首先在元素上写入事件

 ng-focus="myfunction(this)" 

在你的js文件如下

 $scope.myfunction= function (msg, $event) { var el = event.target console.log(el); } 

我也使用过它。

在控制器中有一个使用$ element的解决scheme,如果你不想为这个问题创build另一个指令:

 appControllers.controller('YourCtrl', ['$scope', '$timeout', '$element', function($scope, $timeout, $element) { $scope.updateTypeahead = function() { // ... some logic here $timeout(function() { $element[0].getElementsByClassName('search-query')[0].focus(); // if you have unique id you can use $window instead of $element: // $window.document.getElementById('searchText').focus(); }); } }]); 

这将与ng-change一起工作:

 <input id="searchText" type="text" class="search-query" ng-change="updateTypeahead()" ng-model="searchText" /> 

如果你想ng-model的值,如果你可以这样写在触发事件:$ scope.searchText

我不确定你有哪个版本,但是这个问题很久以前就被问到了。 目前使用Angular 1.5,我可以使用ng-keypress keypress事件和Lodash中的debounce函数来模拟类似ng-change行为,所以我可以捕获$ event

 <input type="text" ng-keypress="edit($event)" ng-model="myModel"> 

$ scope.edit = _.debounce(function($ event){console.log(“$ event”,$ event)},800)