我有以下代码:
app.directive('ngUp', function () {
return function (scope, element, attrs) {
element.bind("keyup", function (event) {
if(event.which === 40) {
console.log('down')
}
else if (event.which === 38) {
console.log('up');
}
else {
console.log('some other');
}
});
};
});
我有:
<div class="scrollbar" id="ex3">
<div>
<ul>
<li ng-repeat="video in videos">
<a href="#" ng-click="select($index)" style="font-size: 100%">
{{video.name | subStringFilter : 20}}
</a>
</li>
</ul>
</div>
如果我把ng-up放在li元素或锚元素上,我会在指令中得到我的元素 a.ng-binding 。
我不知道这是什么。
我想要的是能够使用我的向上和向下箭头键向上和向下滚动列表(并在滚动时将类应用于突出显示的列表元素)。
我希望元素可以是li元素或锚元素,但是我得到 a.ng-binding ,它在向上或向下按键时不会触发。
答案 0 :(得分:7)
请注意,您需要在tabindex
上设置<li>
属性才能触发keyup
事件:
<li tabindex="{{$index}}">
尝试此指令:
app.directive('ngUp', function() {
return {
scope: {
select: "&"
},
link: function(scope, element, attrs) {
element.on("keyup", "[selectable]", function(event) {
var $this = $(this);
var selectedElement = {};
scope.$apply(function() {
if (event.which === 40) {
selectedElement = $this.next("[selectable]");
if (selectedElement.length > 0) {
scope.select({
element: selectedElement
});
}
} else if (event.which === 38) {
selectedElement = $this.prev("[selectable]");
if (selectedElement.length > 0) {
scope.select({
element: $this.prev("[selectable]")
});
}
} else {
}
});
if (selectedElement.length > 0) {
$this.blur();
selectedElement.focus();
}
});
}
}
});
在html中使用它:
<ul ng-up select="select(element)">
<li selectable ng-repeat="video in videos" tabindex="{{$index}}" ng-click="select($event.target)" ng-class="{selected:video.selected}">
<a href="#" style="font-size: 100%">
{{video.name }}
</a>
</li>
</ul>
DEMO(点击选择一个元素,然后你可以用向上和向下箭头选择)
<强>解释强>:
在我看来,这个指令应该在列表项容器元素(在这种情况下是<ul>
)上指定,并且任何可选项都必须应用属性{{1} }。为了使指令可重用,该指令只负责处理selectable
事件并选择元素,如何选择元素的实现细节应作为函数传递:
keyup
每当我需要选择一个元素时,我都会调用这个绑定函数:
scope: {
select: "&"
}
在这个例子中,我假设将元素设置为选中的逻辑如下:
scope.select({
element: $this.prev("[selectable]")
});