FLEX-RangeError: Error #2006: 提供的索引超出范围

问题描述:连续使用PopUpManager弹出新窗口数次后,出现“RangeError: Error #2006: 提供的索引超出范围”错误。

解决方法:弹出部分代码修改为

if(sd.parent==null){ PopUpManager.addPopUp(sd, this, true); }else{ PopUpManager.bringToFront(sd); }

其中sd为弹出窗口组件。

问题出现原因:PopUpManager不能很好的控制添加到其内控件的层级。每次都addPopUp 到最顶层,程序也不知道到底要增加到多少,最多三次就出现这个错误(—。— FLEX bug不少啊)。

class LazyLoader { constructor(dataManager) { this.dataManager = dataManager; this.cache = new Map(); this.entityTypeMap = { bancai: &#39;bancais&#39;, dingdan: &#39;dingdans&#39;, mupi: &#39;mupis&#39;, chanpin: &#39;chanpins&#39;, kucun: &#39;kucuns&#39;, dingdan_bancai: &#39;dingdan_bancais&#39;, chanpin_zujian: &#39;chanpin_zujians&#39;, zujian: &#39;zujians&#39;, caizhi: &#39;caizhis&#39;, dingdan_chanpin: &#39;dingdan_chanpins&#39;, user: &#39;users&#39;, jinhuo: &#39;jinhuos&#39; }; this.proxies = new WeakMap(); } createProxy(entity, entityType) { // 1. 优先检查缓存 if (this.proxies.has(entity)) { return this.proxies.get(entity); } const cacheKey = `${entityType}_${entity.id}`; if (this.cache.has(cacheKey)) { return this.cache.get(cacheKey); } // 2. 代理检测简化 const handler = { get: (target, prop, receiver) => { // 特殊属性处理 if (prop === &#39;id&#39;) return target.id; const value = Reflect.get(target, prop, receiver); // 基本类型直接返回 if (typeof value !== &#39;object&#39; || value === null) { return value; } // 处理数组引用 if (Array.isArray(value)) { const refType = this.getReferenceType(prop); return refType ? this.loadReferences(value, refType) : value; } // 处理对象引用 const refType = this.getReferenceType(prop); if (refType) { //console.log(refType) return this.loadReference(value, refType); } // 检查是否已经代理过这个对象 if (this.proxies.has(value)) { return this.proxies.get(value); } return value; } }; const proxy = new Proxy(entity, handler); // 3. 创建后立即缓存 this.proxies.set(entity, proxy); this.cache.set(cacheKey, proxy); return proxy; } getEntityTypeFromRef(prop) { const baseProp = prop.replace(/\d/g, &#39;&#39;); return baseProp in this.entityTypeMap ? this.entityTypeMap[baseProp] : `${baseProp}s`; } getReferenceType(prop) { try { const baseProp = prop.replace(/\d/g, &#39;&#39;); if (this.entityTypeMap[baseProp]) return this.entityTypeMap[baseProp]; const pluralProp = `${baseProp}s`; if (this.dataManager._rawData[pluralProp]) return pluralProp; } catch (error) { console.log(prop+" ---- "+error) } return null; } loadReference(ref, refType) { if (!ref?.id) { return ref;} const cacheKey = `${refType}_${ref.id}`; // 4. 统一使用缓存机制 if (this.cache.has(cacheKey)) { return this.cache.get(cacheKey); } const entities = this.dataManager._rawData[refType] || []; const entity = entities.find(e => e.id === ref.id); if (!entity) { console.warn(`Entity not found: ${refType} with id ${ref.id}`); return ref; } // 5. 使用createProxy确保代理一致性 const prosty= this.createProxy(entity, refType); return prosty } loadReferences(refs, refType) { return refs.map(ref => this.loadReference(ref, refType)); } resolveReferences(entity) { for (const attr in entity) { const refType = this.getReferenceType(attr); if (!refType) continue; if (Array.isArray(entity[attr])) { entity[attr] = entity[attr].map(item => this.dataManager._rawData[refType]?.find(e => e.id === item.id) || item ); } else if (entity[attr]?.id) { entity[attr] = this.dataManager._rawData[refType]?.find(e => e.id === entity[attr].id) || entity[attr]; } } return entity; } clearCache() { this.cache.clear(); } } class MiniProgramDataManager { constructor(baseUrl = &#39;&#39;) { this.baseUrl = baseUrl; this.debug = true; this.networkAvailable = false; this.isSyncing = false; this.lastSync = null; this.syncInterval = 5 * 60 * 1000; this.storageKey = &#39;miniProgramData&#39;; this._rawData = this.createEmptyData(); this.lazyLoader = new LazyLoader(this); this.callbacks = { all: [], bancais: [], dingdans: [], mupis: [], chanpins: [], kucuns: [], chanpin_zujians: [], dingdan_bancais: [], zujians: [], caizhis: [], dingdan_chanpins: [], users: [], jinhuos: [] }; this.initNetwork(); this.loadDataFromStorage(); this.startAutoSync(); } createEmptyData() { return { bancais: [], dingdans: [], mupis: [], chanpins: [], kucuns: [], dingdan_bancais: [], chanpin_zujians: [], zujians: [], caizhis: [], dingdan_chanpins: [], users: [], jinhuos: [], _lastModified: null, _lastSync: null }; } get data() { const handler = { get: (target, prop) => { if (prop.startsWith(&#39;_&#39;)) return target[prop]; if (Array.isArray(target[prop])) { return target[prop].map(item => this.lazyLoader.createProxy(item, prop.replace(/s$/, &#39;&#39;)) ); } return target[prop]; }, set: (target, prop, value) => { target[prop] = value; return true; } }; return new Proxy(this._rawData, handler); } async initialize() { try { await this.syncData(); return true; } catch (error) { if (this._rawData._lastSync) return true; throw error; } } startAutoSync() { this.autoSyncTimer = setInterval(() => { !this.isSyncing && this.syncData(); }, this.syncInterval); } stopAutoSync() { clearInterval(this.autoSyncTimer); } async initNetwork() { try { const { networkType } = await wx.getNetworkType(); this.networkAvailable = networkType !== &#39;none&#39;; } catch { this.networkAvailable = false; } } async syncData() { if (this.isSyncing) return; this.isSyncing = true; try { const since = this._rawData._lastSync; await this.fetchAll(since); this.lazyLoader.clearCache(); this.saveDataToStorage(); this.triggerCallbacks(&#39;refresh&#39;, &#39;all&#39;, this.data); } catch (error) { console.error(&#39;Sync failed:&#39;, error); this.triggerCallbacks(&#39;sync_error&#39;, &#39;all&#39;, { error }); if (!this._rawData._lastSync) throw error; } finally { this.isSyncing = false; } } async fetchAll(since) { try { const params = since ? { since } : {}; const resolvedData = this.baseUrl ? await this.request(&#39;/app/all&#39;, &#39;GET&#39;, params) : this.createEmptyData(); Object.keys(this._rawData).forEach(key => { if (key.startsWith(&#39;_&#39;) || !resolvedData[key]) return; if (since) { resolvedData[key].forEach(newItem => { const index = this._rawData[key].findIndex(item => item.id === newItem.id); index >= 0 ? this._rawData[key][index] = newItem : this._rawData[key].push(newItem); }); } else { this._rawData[key] = resolvedData[key]; } }); this._rawData._lastSync = new Date().toISOString(); this.saveDataToStorage(); return true; } catch (error) { console.error(&#39;Fetch error:&#39;, error); this.triggerCallbacks(&#39;fetch_error&#39;, &#39;all&#39;, { error }); throw error; } } async request(url, method, data, retryCount = 3) { return new Promise((resolve, reject) => { const fullUrl = `${this.baseUrl}${url}`; const requestTask = () => { wx.request({ url: fullUrl, method, data, header: { &#39;Content-Type&#39;: &#39;application/json&#39; }, success: (res) => { if (res.statusCode >= 200 && res.statusCode < 300) { resolve(res.data.data); } else { const err = new Error(res.data?.message || &#39;API error&#39;); retryCount > 1 ? setTimeout(requestTask, 1000, retryCount - 1) : reject(err); } }, fail: (err) => { retryCount > 1 ? setTimeout(requestTask, 1000, retryCount - 1) : reject(new Error(`Network error: ${err.errMsg}`)); } }); }; requestTask(); }); } registerCallback(entity, callback) { this.callbacks[entity]?.push(callback) || this.callbacks.all.push(callback); } unregisterCallback(entity, callback) { const arr = this.callbacks[entity] || this.callbacks.all; const index = arr.indexOf(callback); if (index !== -1) arr.splice(index, 1); } triggerCallbacks(operation, entity, data) { this.callbacks.all.forEach(cb => cb(operation, entity, data)); this.callbacks[entity]?.forEach(cb => cb(operation, data)); } async crudOperation(operation, entity, data) { try { const result = await this.request(`/app/${operation}/${entity}`, &#39;POST&#39;, data); this.updateLocalData(operation, entity, result || data); this.triggerCallbacks(operation, entity, result || data); return result; } catch (error) { this.triggerCallbacks(`${operation}_error`, entity, { data, error }); throw error; } } updateLocalData(operation, entity, data) { const key = `${entity}s`; const collection = this._rawData[key] || []; switch (operation) { case &#39;add&#39;: collection.push(data); break; case &#39;update&#39;: const index = collection.findIndex(item => item.id === data.id); index >= 0 ? collection[index] = data : collection.push(data); break; case &#39;delete&#39;: const deleteIndex = collection.findIndex(item => item.id === data.id); if (deleteIndex >= 0) collection.splice(deleteIndex, 1); break; } this._rawData._lastModified = new Date().toISOString(); this.lazyLoader.clearCache(); this.saveDataToStorage(); } loadDataFromStorage() { try { const storedData = wx.getStorageSync(this.storageKey); if (storedData) this._rawData = storedData; } catch (error) { console.error(&#39;Storage load error:&#39;, error); } } saveDataToStorage() { try { wx.setStorageSync(this.storageKey, this._rawData); } catch (error) { console.error(&#39;Storage save error:&#39;, error); wx.showToast({ title: &#39;数据保存失败&#39;, icon: &#39;none&#39; }); } } async addEntity(entity, data) { return this.crudOperation(&#39;add&#39;, entity, data); } async updateEntity(entity, data) { return this.crudOperation(&#39;update&#39;, entity, data); } async deleteEntity(entity, id) { return this.crudOperation(&#39;delete&#39;, entity, { id }); } async transactionalOperation(endpoint, data) { try { await this.request(`/app/Transactional/${endpoint}`, &#39;POST&#39;, data); await this.syncData(); return true; } catch (error) { this.triggerCallbacks(&#39;transaction_error&#39;, endpoint, { data, error }); throw error; } } } module.exports = MiniProgramDataManager; try { const baseProp = prop.replace(/\d/g, &#39;&#39;); if (this.entityTypeMap[baseProp]) return this.entityTypeMap[baseProp]; const pluralProp = `${baseProp}s`; if (this.dataManager._rawData[pluralProp]) return pluralProp; } catch (error) { console.log(prop+" ---- "+error)//一直被触发 }---------------------------MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancai ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancai ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancai ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancai ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancai ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancai ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancai ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancai ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancai ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancai ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancai ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi1 ---- RangeError: Maximum call stack size exceeded MiniProgramDataManager.js? [sm]:98 bancaisForMupi2 ---- RangeError: Maximum call stack size exceeded
最新发布
07-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值