fix restoring outputs in Vue nodes (persisting node outputs when switching between workflow tabs) (#5788)

## Summary

Fixed Vue node output restoration by consolidating state management
through the node output store.

## Changes

- **What**: Refactored node output cleanup and restoration logic in
`ChangeTracker` and `ComfyApp` to use centralized store methods
- **Breaking**: Removed direct manipulation of `app.nodeOutputs` in
favor of store-managed state

## Review Focus

State synchronization between `app.nodeOutputs` and `nodeOutputs.value`
during restore/reset operations, ensuring Vue reactivity is maintained.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-5788-fix-restoring-outputs-in-Vue-nodes-persisting-node-outputs-when-switching-between-workfl-27a6d73d365081b39411fed7479d8ac5)
by [Unito](https://www.unito.io)
This commit is contained in:
Christian Byrne
2025-09-25 19:49:49 -07:00
committed by GitHub
parent a6600aa109
commit 78d585eca0
3 changed files with 19 additions and 4 deletions

View File

@@ -1778,9 +1778,8 @@ export class ComfyApp {
* Clean current state * Clean current state
*/ */
clean() { clean() {
this.nodeOutputs = {} const nodeOutputStore = useNodeOutputStore()
const { revokeAllPreviews } = useNodeOutputStore() nodeOutputStore.resetAllOutputsAndPreviews()
revokeAllPreviews()
const executionStore = useExecutionStore() const executionStore = useExecutionStore()
executionStore.lastNodeErrors = null executionStore.lastNodeErrors = null
executionStore.lastExecutionError = null executionStore.lastExecutionError = null

View File

@@ -10,6 +10,7 @@ import {
import type { ComfyWorkflowJSON } from '@/platform/workflow/validation/schemas/workflowSchema' import type { ComfyWorkflowJSON } from '@/platform/workflow/validation/schemas/workflowSchema'
import type { ExecutedWsMessage } from '@/schemas/apiSchema' import type { ExecutedWsMessage } from '@/schemas/apiSchema'
import { useExecutionStore } from '@/stores/executionStore' import { useExecutionStore } from '@/stores/executionStore'
import { useNodeOutputStore } from '@/stores/imagePreviewStore'
import { useSubgraphNavigationStore } from '@/stores/subgraphNavigationStore' import { useSubgraphNavigationStore } from '@/stores/subgraphNavigationStore'
import { api } from './api' import { api } from './api'
@@ -86,7 +87,7 @@ export class ChangeTracker {
app.canvas.ds.offset = this.ds.offset app.canvas.ds.offset = this.ds.offset
} }
if (this.nodeOutputs) { if (this.nodeOutputs) {
app.nodeOutputs = this.nodeOutputs useNodeOutputStore().restoreOutputs(this.nodeOutputs)
} }
if (this.subgraphState) { if (this.subgraphState) {
const { navigation } = this.subgraphState const { navigation } = this.subgraphState

View File

@@ -328,6 +328,19 @@ export const useNodeOutputStore = defineStore('nodeOutput', () => {
return hadOutputs return hadOutputs
} }
function restoreOutputs(
outputs: Record<string, ExecutedWsMessage['output']>
) {
app.nodeOutputs = outputs
nodeOutputs.value = outputs
}
function resetAllOutputsAndPreviews() {
app.nodeOutputs = {}
nodeOutputs.value = {}
revokeAllPreviews()
}
return { return {
// Getters // Getters
getNodeOutputs, getNodeOutputs,
@@ -346,6 +359,8 @@ export const useNodeOutputStore = defineStore('nodeOutput', () => {
revokeAllPreviews, revokeAllPreviews,
revokeSubgraphPreviews, revokeSubgraphPreviews,
removeNodeOutputs, removeNodeOutputs,
restoreOutputs,
resetAllOutputsAndPreviews,
// State // State
nodeOutputs, nodeOutputs,