cc.ScrollView 源码问题请教

在 cc.ScrollView 中的 _hasNestedViewGroup 函数

    _hasNestedViewGroup (event, captureListeners) {
        if (event.eventPhase !== cc.Event.CAPTURING_PHASE) return;

        if (captureListeners) {
            //captureListeners are arranged from child to parent
            for (let i = 0; i < captureListeners.length; ++i){
                let item = captureListeners[i];

                if (this.node === item) {
                    if (event.target.getComponent(cc.ViewGroup)) {
                        return true;
                    }
                    return false;
                }

                if(item.getComponent(cc.ViewGroup)) {
                    return true;
                }
            }
        }
        return false;
    },
  1. 我想问一下这段代码具体有什么作用,看不太明白
        if (captureListeners) {
            //captureListeners are arranged from child to parent
            for (let i = 0; i < captureListeners.length; ++i){
                let item = captureListeners[i];

                if (this.node === item) {
                    if (event.target.getComponent(cc.ViewGroup)) {
                        return true;
                    }
                    return false;
                }

                if(item.getComponent(cc.ViewGroup)) {
                    return true;
                }
            }
        }

我在论坛中找到的 PageView 嵌套 ScrollView 方法,重写上面函数:

cc.Class({
	extends: cc.PageView,
	//this is for nested scrollview
	_hasNestedViewGroup: function(event, captureListeners) {
		if (event.eventPhase !== cc.Event.CAPTURING_PHASE) return;

                // 这四句是加的,用于实现嵌套
		const touch = event.touch;
		if (!touch) return;
		const deltaMove = touch.getLocation().sub(touch.getStartLocation());
		if (deltaMove.x > 7 || deltaMove.x < -7) return false;

		if (captureListeners) {
			for (var i = 0; i < captureListeners.length; ++i) {
				var item = captureListeners[i];

				if (this.node === item) {
					if (event.target.getComponent(cc.ViewGroup)) {
						return true;
					}
					return false;
				}

				if (item.getComponent(cc.ViewGroup)) {
					return true;
				}
			}
		}

		return false;
	},
});

用这个脚本替换 PageView,有时候会报错:

Uncaught TypeError: Cannot read property '_capturingListeners' of undefined
    at _doDispatchEvent (CCNode.js:630)
    at cc_Node.dispatchEvent (CCNode.js:2380)
    at TouchOneByOne._touchMoveHandler [as onTouchMoved] (CCNode.js:478)
    at _onTouchEventCallback (CCEventManager.js:517)
    at Object._dispatchEventToListeners (CCEventManager.js:646)
    at Object._dispatchTouchEvent (CCEventManager.js:568)
    at Object.dispatchEvent (CCEventManager.js:1031)
    at Object.handleTouchesMove (CCInputManager.js:197)
    at _mouseEventsOnElement (CCInputManager.js:458)
    at HTMLCanvasElement.<anonymous> (CCInputManager.js:482)

频率还有点高,但是不影响实际效果。
2. 还想请教下这个问题的修复方式?

請問後來有解決嗎?

發現在這樣改法後 子節點中的發射事件都會有此錯誤 除非unregist 掉在打開 但是事件的按鈕也有測定TOUCH-END的 在此之前還是需要觸發上下左右的滑動