#javascript #angularjs #angularjs-directive #scope #angularjs-scope
#javascript #angularjs #angularjs-директива #область видимости #angularjs-область
Вопрос:
Я пытаюсь получить индекс элемента click, но продолжаю входить -1
в консоль. Я использую Array.prototype
, чтобы получить indexOf
из nodelist
HTML:
<div ng-app='app' ng-controller='mainCtrl'>
<div app-click="">
<div ng-repeat="json in myJson">
<li>{{json}}</li>
</div>
</div>
</div>
JS:
.directive('appClick', function() {
return {
restrict: 'A',
scope: true,
controller: function($scope, $element) {
$element.bind("click",function(e){
var index = Array.prototype.indexOf.call($element.children(), e.target);
console.log(index);
});
}
}
});
Ответ №1:
Другой вариант — установить индекс
<div ng-app='app' ng-controller='mainCtrl'>
<div app-click="">
<div ng-repeat="json in myJson">
<li data-index="{{$index}}">{{json}}</li>
</div>
</div>
</div>
и прочитать его в щелчке
e.target.dataset.index
Комментарии:
1. Должен был подумать об этом! Спасибо.
2. это приводит к другому поведению при нажатии клавиши.. если я хочу, чтобы клавиша ввода имела то же поведение, что и щелчок… Я получаю неопределенный, когда нажимаю enter, но правильный e.target при нажатии
3. Как у li есть нажатие клавиши?
4. если я перейду к нему … и нажму enter… Я настроил tabindexes для своего контейнера и его дочерних элементов
5. итак, что такое e.target? Проблема не в индексе, проблема заключается в том, как вы связали событие.
Ответ №2:
e.target
возвращает элемент li,$element.children() возвращает div
список не li
попробуйте этот код:
var index = Array.prototype.indexOf.call($element.find("li"), e.target);
angular.module('app', []).controller('mainCtrl', function($scope) {
$scope.myJson = ["mayank1", "mayank2", "mayank3", "mayank4", "mayank5", "mayank6", "mayank7", "mayank8", "mayank9"]
})
.directive('appClick', function() {
return {
restrict: 'A',
scope: true,
controller: function($scope, $element) {
$element.bind("click",function(e){
var index = Array.prototype.indexOf.call($element.find("li"), e.target);
console.log(index);
});
}
}
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.20/angular.min.js"></script>
<div ng-app='app' ng-controller='mainCtrl'>
<div app-click="">
<div ng-repeat="json in myJson">
<li>{{json}}</li>
</div>
</div>
</div>
Комментарии:
1. Один вопрос. Что делать, если у меня несколько li, и я хочу перейти к определенному li с class=»list1″
2. А также … можете ли вы объяснить, почему $element.children() не работает?
3. Вы можете использовать
.find("li[class='list1']")
, чтобы узнать элемент4. @user4756836 $element.children() возвращает
div
не списокli
, а e.target возвращает элемент li