我正在使用AngularJS框架玩,我偶然发现了一个问题。我做了一个名为'enter'的指令。它会触发mouseenter
和mouseleave
上的功能。我将它作为属性应用于表行元素。现在已触发每个子元素(所有列等),但只有当您将鼠标放在表格行上时才会触发它。
这是我的指令的样子:
myapp.directive('enter', function(){
return {
restrict: 'A', // link to attribute... default is A
link: function (scope, element){
element.bind('mouseenter',function() {
console.log('MOUSE ENTER: ' + scope.movie.title);
});
element.bind('mouseleave',function() {
console.log('LEAVE');
});
}
}
});
以下是一个示例:http://jsfiddle.net/dJGfd/1/
您必须打开Javascript控制台才能看到日志消息。
在AngularJS中实现我想要的功能的最佳方法是什么?如果有合理的AngularJS解决方案,我更喜欢不使用jQuery。
答案 0 :(得分:6)
你可以试试这个:
myapp.directive('enter', function () {
return {
restrict: 'A',
controller: function ($scope, $timeout) {
// do we have started timeout
var timeoutStarted = false;
// pending value of mouse state
var pendingMouseState = false;
$scope.changeMouseState = function (newMouseState) {
// if pending value equals to new value then do nothing
if (pendingMouseState == newMouseState) {
return;
}
// otherwise store new value
pendingMouseState = newMouseState;
// and start timeout
startTimer();
};
function startTimer() {
// if timeout started then do nothing
if (timeoutStarted) {
return;
}
// start timeout 10 ms
$timeout(function () {
// reset value of timeoutStarted flag
timeoutStarted = false;
// apply new value
$scope.mouseOver = pendingMouseState;
}, 10, true);
}
},
link: function (scope, element) {
//**********************************************
// bind to "mouseenter" and "mouseleave" events
//**********************************************
element.bind('mouseover', function (event) {
scope.changeMouseState(true);
});
element.bind('mouseleave', function (event) {
scope.changeMouseState(false);
});
//**********************************************
// watch value of "mouseOver" variable
// or you create bindings in markup
//**********************************************
scope.$watch("mouseOver", function (value) {
console.log(value);
});
}
}
});
同样的事情http://jsfiddle.net/22WgG/
也改为
element.bind("mouseenter", ...);
和
element.bind("mouseleave", ...);
你可以指定
<tr enter ng-mouseenter="changeMouseState(true)" ng-mouseleave="changeMouseState(false)">...</tr>