将事件对象从指令传递到回调
Pass event object from directive to callback
我正在使用 Angular 1.5.6。
我有一个检查双击的指令:
angular.module('redMatter.analyse')
.directive('iosDblclick',
function () {
var DblClickInterval = 300; //milliseconds
var firstClickTime;
var waitingSecondClick = false;
return {
restrict: 'A',
link: function (scope, element, attrs) {
element.bind('click', function (e) {
if (!waitingSecondClick) {
firstClickTime = (new Date()).getTime();
waitingSecondClick = true;
setTimeout(function () {
waitingSecondClick = false;
}, DblClickInterval);
}
else {
waitingSecondClick = false;
var time = (new Date()).getTime();
if (time - firstClickTime < DblClickInterval) {
scope.$apply(attrs.iosDblclick);
}
}
});
}
};
});
我在这里使用这个:
<div ios-dblclick="onDoubleClick($event, graph)" ></div>
graph
是 ng-repeat
指令中的一个对象。在 onDoubleClick 中,我需要访问 $event
:
$scope.onDoubleClick = function($event, graph){
console.log('in onDoubleClick and arguments are ', arguments);
var element = $event.srcElement;
但是我不确定如何将事件从指令传递到 onDoubleClick
。在控制台日志中,参数打印为:
[undefined, Object]
其中 Object
是 graph
。我怎样才能同时传回事件?
已更新
http://jsfiddle.net/ADukg/14470/ - 工作示例。
因此,您可以像这样将函数传递给指令:
<div ios-dblclick="onDoubleClick" ios-dblclick-arg="graf" ></div>
在你的指令中:
return {
restrict: 'A',
scope: {
myCallback: '=iosDblclick',
graph: '=iosDblclickArg'
},
link: function (scope, element, attrs) {
element.bind('click', function (e) {
if (!waitingSecondClick) {
firstClickTime = (new Date()).getTime();
waitingSecondClick = true;
setTimeout(function () {
waitingSecondClick = false;
}, DblClickInterval);
}
else {
waitingSecondClick = false;
var time = (new Date()).getTime();
if (time - firstClickTime < DblClickInterval) {
scope.myCallback(e, scope.graph)
}
}
});
}
}
您可以将回调传递给指令,如下所示:onDoubleClick: '&'
- 隔离范围
webApp.directive('iosDblclick',
function () {
var DblClickInterval = 300; //milliseconds
var firstClickTime;
var waitingSecondClick = false;
return {
restrict: 'A',
scope: {
onDoubleClick: '&'
},
link: function (scope, element, attrs) {
element.bind('click', function (e) {
if (!waitingSecondClick) {
firstClickTime = (new Date()).getTime();
waitingSecondClick = true;
setTimeout(function () {
waitingSecondClick = false;
}, DblClickInterval);
}
else {
waitingSecondClick = false;
var time = (new Date()).getTime();
if (time - firstClickTime < DblClickInterval) {
scope.onDoubleClick({data: {e:e, val: "someValue"}});
}
}
});
}
};
});
其中 HTML 是:
<div ios-dblclick on-double-click="onDoubleClick(data)" ></div>
和控制器:
$scope.onDoubleClick = function(data){
var element = data.e.srcElement;
}
由于您可以使用 $eval
方法传递 locals
,请考虑在调用 attrs.iosDblclick
时使用它。在内部它使用 $parse
API 来评估方法并使用本地作为参数。
scope.$eval(attrs.iosDblclick, {$event: e});
另见
我正在使用 Angular 1.5.6。
我有一个检查双击的指令:
angular.module('redMatter.analyse')
.directive('iosDblclick',
function () {
var DblClickInterval = 300; //milliseconds
var firstClickTime;
var waitingSecondClick = false;
return {
restrict: 'A',
link: function (scope, element, attrs) {
element.bind('click', function (e) {
if (!waitingSecondClick) {
firstClickTime = (new Date()).getTime();
waitingSecondClick = true;
setTimeout(function () {
waitingSecondClick = false;
}, DblClickInterval);
}
else {
waitingSecondClick = false;
var time = (new Date()).getTime();
if (time - firstClickTime < DblClickInterval) {
scope.$apply(attrs.iosDblclick);
}
}
});
}
};
});
我在这里使用这个:
<div ios-dblclick="onDoubleClick($event, graph)" ></div>
graph
是 ng-repeat
指令中的一个对象。在 onDoubleClick 中,我需要访问 $event
:
$scope.onDoubleClick = function($event, graph){
console.log('in onDoubleClick and arguments are ', arguments);
var element = $event.srcElement;
但是我不确定如何将事件从指令传递到 onDoubleClick
。在控制台日志中,参数打印为:
[undefined, Object]
其中 Object
是 graph
。我怎样才能同时传回事件?
已更新
http://jsfiddle.net/ADukg/14470/ - 工作示例。
因此,您可以像这样将函数传递给指令:
<div ios-dblclick="onDoubleClick" ios-dblclick-arg="graf" ></div>
在你的指令中:
return {
restrict: 'A',
scope: {
myCallback: '=iosDblclick',
graph: '=iosDblclickArg'
},
link: function (scope, element, attrs) {
element.bind('click', function (e) {
if (!waitingSecondClick) {
firstClickTime = (new Date()).getTime();
waitingSecondClick = true;
setTimeout(function () {
waitingSecondClick = false;
}, DblClickInterval);
}
else {
waitingSecondClick = false;
var time = (new Date()).getTime();
if (time - firstClickTime < DblClickInterval) {
scope.myCallback(e, scope.graph)
}
}
});
}
}
您可以将回调传递给指令,如下所示:onDoubleClick: '&'
- 隔离范围
webApp.directive('iosDblclick',
function () {
var DblClickInterval = 300; //milliseconds
var firstClickTime;
var waitingSecondClick = false;
return {
restrict: 'A',
scope: {
onDoubleClick: '&'
},
link: function (scope, element, attrs) {
element.bind('click', function (e) {
if (!waitingSecondClick) {
firstClickTime = (new Date()).getTime();
waitingSecondClick = true;
setTimeout(function () {
waitingSecondClick = false;
}, DblClickInterval);
}
else {
waitingSecondClick = false;
var time = (new Date()).getTime();
if (time - firstClickTime < DblClickInterval) {
scope.onDoubleClick({data: {e:e, val: "someValue"}});
}
}
});
}
};
});
其中 HTML 是:
<div ios-dblclick on-double-click="onDoubleClick(data)" ></div>
和控制器:
$scope.onDoubleClick = function(data){
var element = data.e.srcElement;
}
由于您可以使用 $eval
方法传递 locals
,请考虑在调用 attrs.iosDblclick
时使用它。在内部它使用 $parse
API 来评估方法并使用本地作为参数。
scope.$eval(attrs.iosDblclick, {$event: e});
另见