在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)