在使用angular-hammer的ryan mullins分叉时,我不清楚如何通过requireFailure
属性将hmRecognizerOptions
多个识别器连接起来......如果可能的话。
我对源代码的细读给我留下了可以做到的印象,但是我对在给定元素上创建识别器的顺序存在问题。
要直接查看问题,请使用现有的默认演示,并添加以下hm-recognizer-options
属性,
<div id="target"
ng-controller="hmCtrl"
hm-pan="onHammer"
hm-pinch="onHammer"
hm-press="onHammer"
hm-rotate="onHammer"
hm-swipe="onHammer"
hm-tap="onHammer"
hm-doubletap="onHammer"
hm-recognizer-options='[
{"type":"pan","requireFailure":"swipe"}
]'>
{{eventType}}
</div>
(另请参阅此plunker:http://embed.plnkr.co/3sJFrC/preview 以及控制台中产生的错误
我希望这会导致只有在滑动失败后才能识别平移。但是,逐步执行代码会发现,当pan试图在requireFailure
调用期间引用它时,滑动识别器尚未实例化。
还不清楚这是如何工作的,因为看起来requireFailure
(在HammerJS中)也会通过方法结尾附近的otherRecognizer.requireFailure(this)
行自动创建反向引用,
/**
* recognizer can only run when an other is failing
* @param {Recognizer} otherRecognizer
* @returns {Recognizer} this
*/
requireFailure: function(otherRecognizer) {
if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {
return this;
}
var requireFail = this.requireFail;
otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);
if (inArray(requireFail, otherRecognizer) === -1) {
requireFail.push(otherRecognizer);
otherRecognizer.requireFailure(this);
}
return this;
}
简而言之,在调用requireFailure
之前,似乎必须先实例化两个识别器,但angular.hammer.js会在创建每个识别器时处理hm-recognizer-options
。
我在某个地方错过了一个技巧吗? 或者我将创建自己的指令来管理requireFailure(和/或recognWith)连线?