feat: performance improvement for eventListeners (#34613)
PR Close #34613
This commit is contained in:
parent
4d36b2f6e9
commit
a3c7ab99b7
@ -44,6 +44,16 @@ export const globalSources: any = {};
|
|||||||
const EVENT_NAME_SYMBOL_REGX = new RegExp('^' + ZONE_SYMBOL_PREFIX + '(\\w+)(true|false)$');
|
const EVENT_NAME_SYMBOL_REGX = new RegExp('^' + ZONE_SYMBOL_PREFIX + '(\\w+)(true|false)$');
|
||||||
const IMMEDIATE_PROPAGATION_SYMBOL = zoneSymbol('propagationStopped');
|
const IMMEDIATE_PROPAGATION_SYMBOL = zoneSymbol('propagationStopped');
|
||||||
|
|
||||||
|
function prepareEventNames(eventName: string, eventNameToString?: (eventName: string) => string) {
|
||||||
|
const falseEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + FALSE_STR;
|
||||||
|
const trueEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + TRUE_STR;
|
||||||
|
const symbol = ZONE_SYMBOL_PREFIX + falseEventName;
|
||||||
|
const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
|
||||||
|
zoneSymbolEventNames[eventName] = {};
|
||||||
|
zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
|
||||||
|
zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
|
||||||
|
}
|
||||||
|
|
||||||
export interface PatchEventTargetOptions {
|
export interface PatchEventTargetOptions {
|
||||||
// validateHandler
|
// validateHandler
|
||||||
vh?: (nativeDelegate: any, delegate: any, target: any, args: any) => boolean;
|
vh?: (nativeDelegate: any, delegate: any, target: any, args: any) => boolean;
|
||||||
@ -387,23 +397,12 @@ export function patchEventTarget(
|
|||||||
}
|
}
|
||||||
|
|
||||||
const zone = Zone.current;
|
const zone = Zone.current;
|
||||||
const symbolEventNames = zoneSymbolEventNames[eventName];
|
let symbolEventNames = zoneSymbolEventNames[eventName];
|
||||||
let symbolEventName;
|
|
||||||
if (!symbolEventNames) {
|
if (!symbolEventNames) {
|
||||||
// the code is duplicate, but I just want to get some better performance
|
prepareEventNames(eventName, eventNameToString);
|
||||||
const falseEventName =
|
symbolEventNames = zoneSymbolEventNames[eventName];
|
||||||
(eventNameToString ? eventNameToString(eventName) : eventName) + FALSE_STR;
|
|
||||||
const trueEventName =
|
|
||||||
(eventNameToString ? eventNameToString(eventName) : eventName) + TRUE_STR;
|
|
||||||
const symbol = ZONE_SYMBOL_PREFIX + falseEventName;
|
|
||||||
const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
|
|
||||||
zoneSymbolEventNames[eventName] = {};
|
|
||||||
zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
|
|
||||||
zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
|
|
||||||
symbolEventName = capture ? symbolCapture : symbol;
|
|
||||||
} else {
|
|
||||||
symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
|
|
||||||
}
|
}
|
||||||
|
const symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
|
||||||
let existingTasks = target[symbolEventName];
|
let existingTasks = target[symbolEventName];
|
||||||
let isExisting = false;
|
let isExisting = false;
|
||||||
if (existingTasks) {
|
if (existingTasks) {
|
||||||
@ -668,6 +667,7 @@ export function patchEventTarget(
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function findEventTasks(target: any, eventName: string): Task[] {
|
export function findEventTasks(target: any, eventName: string): Task[] {
|
||||||
|
if (!eventName) {
|
||||||
const foundTasks: any[] = [];
|
const foundTasks: any[] = [];
|
||||||
for (let prop in target) {
|
for (let prop in target) {
|
||||||
const match = EVENT_NAME_SYMBOL_REGX.exec(prop);
|
const match = EVENT_NAME_SYMBOL_REGX.exec(prop);
|
||||||
@ -682,6 +682,20 @@ export function findEventTasks(target: any, eventName: string): Task[] {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return foundTasks;
|
return foundTasks;
|
||||||
|
}
|
||||||
|
let symbolEventName = zoneSymbolEventNames[eventName];
|
||||||
|
if (!symbolEventName) {
|
||||||
|
prepareEventNames(eventName);
|
||||||
|
symbolEventName = zoneSymbolEventNames[eventName];
|
||||||
|
}
|
||||||
|
const captureFalseTasks = target[symbolEventName[FALSE_STR]];
|
||||||
|
const captureTrueTasks = target[symbolEventName[TRUE_STR]];
|
||||||
|
if (!captureFalseTasks) {
|
||||||
|
return captureTrueTasks ? captureTrueTasks.slice() : [];
|
||||||
|
} else {
|
||||||
|
return captureTrueTasks ? captureFalseTasks.concat(captureTrueTasks) :
|
||||||
|
captureFalseTasks.slice();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function patchEventPrototype(global: any, api: _ZonePrivate) {
|
export function patchEventPrototype(global: any, api: _ZonePrivate) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user