2025-11-19 00:35
<!-- ❌ 问题代码 -->
<app-revision-task-modal
[availableSpaces]="getAvailableSpacesForRevision()"> <!-- 每次都创建新数组 -->
</app-revision-task-modal>
<app-drag-upload-modal
[availableSpaces]="getAvailableSpaces()"> <!-- 每次都创建新数组 -->
[availableStages]="getAvailableStages()"> <!-- 每次都创建新数组 -->
</app-drag-upload-modal>
Angular 变更检测
↓
调用 getAvailableSpacesForRevision()
↓
返回新数组引用
↓
revision-task-modal 的 ngOnChanges 被触发
↓
modal 内部状态更新
↓
触发父组件变更检测
↓
再次调用 getAvailableSpacesForRevision()
↓
无限循环 🔄
文件:stage-delivery.component.ts(第126行)
// 缓存的空间和阶段列表(避免频繁创建新数组)
cachedAvailableSpaces: Array<{ id: string; name: string }> = [];
cachedAvailableStages: Array<{ id: string; name: string }> = [];
cachedRevisionSpaces: Array<{ id: string; name: string; selected: boolean }> = [];
文件:stage-delivery.component.ts(第2807-2829行)
private updateCachedLists(): void {
this.cachedAvailableSpaces = this.projectProducts.map(...);
this.cachedAvailableStages = this.deliveryTypes.map(...);
this.cachedRevisionSpaces = this.projectProducts.map(...); // 🆕 新增
}
文件:stage-delivery-new.component.html
<!-- ✅ 修复后 -->
<app-revision-task-modal
[availableSpaces]="cachedRevisionSpaces"> <!-- 属性绑定 -->
</app-revision-task-modal>
<app-drag-upload-modal
[availableSpaces]="cachedAvailableSpaces"> <!-- 属性绑定 -->
[availableStages]="cachedAvailableStages"> <!-- 属性绑定 -->
</app-drag-upload-modal>
文件:drag-upload-modal.component.ts(第116-123行)
ngOnChanges(changes: SimpleChanges) {
// 🔥 只在关键变化时输出日志
if (changes['visible'] || changes['droppedFiles']) {
console.log('🔄 ngOnChanges (关键变化)', ...);
}
}
Ctrl + Shift + R
Cmd + Shift + R
刷新后应该看到:
✅ 缓存列表已更新: {空间数量: 2, 阶段数量: 4, 工单空间数量: 2}
不应该再看到:
❌ 🔄 ngOnChanges 被调用 (疯狂重复)
❌ 已加载交付文件 (重复打印)
点击"创建改图任务"
点击"改图工单"
# 1. 停止当前服务器
Ctrl + C
# 2. 清除 node_modules 缓存(可选)
rm -rf .angular/cache
# 或 Windows
rd /s /q .angular\cache
# 3. 重新启动
ng serve
在浏览器控制台执行:
// 临时移除可能干扰的组件
document.querySelector('app-drag-upload-modal')?.remove();
// 然后测试改图工单是否可以点击
在控制台执行:
// 检查所有 modal 的 z-index 和 pointer-events
document.querySelectorAll('[class*="modal"]').forEach(el => {
const z = window.getComputedStyle(el).zIndex;
const pe = window.getComputedStyle(el).pointerEvents;
const display = window.getComputedStyle(el).display;
console.log(el.className, {
zIndex: z,
pointerEvents: pe,
display: display
});
});
期望输出:
modal-overlay {zIndex: "2400", pointerEvents: "auto", display: "flex"}
modal-container {zIndex: "1", pointerEvents: "auto", display: "flex"}
如果弹窗仍被遮挡,在控制台执行:
// 强制提升改图工单弹窗的 z-index
const modal = document.querySelector('.modal-overlay');
if (modal) {
modal.style.zIndex = '9999';
console.log('✅ 已强制提升 z-index');
}
页面主体: 0
图片库: 1000
拖拽上传弹窗: 2000
工单列表全屏: 2100
消息发送弹窗: 2300
创建工单弹窗: 2400 ← 改图任务弹窗
审批/报价弹窗: 2500 ← 最高
截图中的 WebSocket 错误:
WebSocket connection to 'ws://127.0.0.1:8080/sockjs-node/...' failed
Error: net::ERR_CONNECTION_REFUSED
这不影响弹窗交互!
如需修复,重启开发服务器即可。
ng serve 显示"Compiled successfully"Angular 变更检测机制
对象引用比较
性能影响
// ✅ 使用缓存属性
private cachedData: any[] = [];
updateData() {
this.cachedData = this.compute(); // 只在需要时更新
}
// ❌ 不要在模板中调用方法
getData(): any[] {
return this.compute(); // 每次变更检测都会调用
}
提供以下信息:
修复完成时间:2025-11-19 00:35
修复人:Cascade AI Assistant
状态:✅ 所有代码已修复,等待浏览器刷新生效