logologo
Start
Handbuch
Entwickler
Plugins
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
Start
Handbuch
Entwickler
Plugins
API
logologo

Einführung

Was ist FlowEngine?
FlowEngine & Plugins
Schnellstart
Lernpfad

Leitfaden

FlowModel registrieren
FlowModel erstellen
FlowModel rendern
FlowModel: Event-Flow & Konfiguration
FlowModel-Persistenz
FlowModel-Lebenszyklus
FlowModel-Kontextsystem
Reaktivität: Observable
FlowModel vs. React.Component

Definitionen

ModelDefinition
FlowDefinition
EventDefinition
ActionDefinition
StepDefinition
Previous PageFlowDefinition
Next PageActionDefinition
KI-Übersetzungshinweis

Diese Dokumentation wurde automatisch von KI übersetzt.

#EventDefinition

EventDefinition definiert die Ereignisbehandlungslogik in einem Workflow und wird verwendet, um auf bestimmte Ereignisauslöser zu reagieren. Ereignisse sind ein wichtiger Mechanismus in der FlowEngine, um die Ausführung von Workflows zu starten.

#Typdefinition

type EventDefinition<TModel extends FlowModel = FlowModel, TCtx extends FlowContext = FlowContext> = ActionDefinition<TModel, TCtx>;

EventDefinition ist eigentlich ein Alias für ActionDefinition und besitzt daher dieselben Eigenschaften und Methoden.

#Registrierungsarten

// Globale Registrierung (über FlowEngine)
const engine = new FlowEngine();
engine.registerEvent({
  name: 'clickEvent',
  title: 'Click Event',
  handler: async (ctx, params) => {
    // Ereignisbehandlungslogik
  }
});

// Modellbasierte Registrierung (über FlowModel)
class MyModel extends FlowModel {}
MyModel.registerEvent({
  name: 'submitEvent',
  title: 'Submit Event',
  handler: async (ctx, params) => {
    // Ereignisbehandlungslogik
  }
});

// Verwendung in einem Workflow
MyModel.registerFlow({
  key: 'formFlow',
  on: 'submitEvent',  // Verweis auf ein registriertes Ereignis
  steps: {
    step1: {
      use: 'processFormAction'
    }
  }
});

#Eigenschaften

#name

Typ: string
Erforderlich: Ja
Beschreibung: Der eindeutige Bezeichner für das Ereignis.

Wird verwendet, um das Ereignis in einem Workflow über die Eigenschaft on zu referenzieren.

Beispiel:

name: 'clickEvent'
name: 'submitEvent'
name: 'customEvent'

#title

Typ: string
Erforderlich: Nein
Beschreibung: Der Anzeigetitel für das Ereignis.

Wird für die Anzeige in der Benutzeroberfläche und zum Debuggen verwendet.

Beispiel:

title: 'Click Event'
title: 'Form Submit'
title: 'Data Change'

#handler

Typ: (ctx: TCtx, params: any) => Promise<any> | any
Erforderlich: Ja
Beschreibung: Die Handler-Funktion für das Ereignis.

Die Kernlogik des Ereignisses, die den Kontext und die Parameter empfängt und das Verarbeitungsergebnis zurückgibt.

Beispiel:

handler: async (ctx, params) => {
  const { model, flowEngine } = ctx;
  
  try {
    // Ereignisbehandlungslogik ausführen
    const result = await handleEvent(params);
    
    // Ergebnis zurückgeben
    return {
      success: true,
      data: result,
      message: 'Event handled successfully'
    };
  } catch (error) {
    return {
      success: false,
      error: error.message
    };
  }
}

#defaultParams

Typ: Record<string, any> | ((ctx: TCtx) => Record<string, any> | Promise<Record<string, any>>)
Erforderlich: Nein
Beschreibung: Die Standardparameter für das Ereignis.

Füllt Parameter mit Standardwerten auf, wenn das Ereignis ausgelöst wird.

Beispiel:

// Statische Standardparameter
defaultParams: {
  preventDefault: true,
  stopPropagation: false
}

// Dynamische Standardparameter
defaultParams: (ctx) => {
  return {
    timestamp: Date.now(),
    userId: ctx.model.uid,
    eventSource: 'user'
  }
}

// Asynchrone Standardparameter
defaultParams: async (ctx) => {
  const userInfo = await getUserInfo();
  return {
    user: userInfo,
    session: await getSessionInfo()
  }
}

#uiSchema

Typ: Record<string, ISchema> | ((ctx: TCtx) => Record<string, ISchema> | Promise<Record<string, ISchema>>)
Erforderlich: Nein
Beschreibung: Das UI-Konfigurationsschema für das Ereignis.

Definiert die Anzeigemethode und Formular-Konfiguration für das Ereignis in der Benutzeroberfläche.

Beispiel:

uiSchema: {
  'x-component': 'Form',
  'x-component-props': {
    layout: 'vertical'
  },
  properties: {
    preventDefault: {
      type: 'boolean',
      title: 'Prevent Default',
      'x-component': 'Switch',
      'x-decorator': 'FormItem'
    },
    stopPropagation: {
      type: 'boolean',
      title: 'Stop Propagation',
      'x-component': 'Switch',
      'x-decorator': 'FormItem'
    },
    customData: {
      type: 'object',
      title: 'Custom Data',
      'x-component': 'Form',
      'x-decorator': 'FormItem',
      properties: {
        key: {
          type: 'string',
          title: 'Key',
          'x-component': 'Input'
        },
        value: {
          type: 'string',
          title: 'Value',
          'x-component': 'Input'
        }
      }
    }
  }
}

#beforeParamsSave

Typ: (ctx: FlowSettingsContext<TModel>, params: any, previousParams: any) => void | Promise<void>
Erforderlich: Nein
Beschreibung: Die Hook-Funktion, die vor dem Speichern der Parameter ausgeführt wird.

Wird ausgeführt, bevor Ereignisparameter gespeichert werden, und kann zur Parametervalidierung oder -transformation verwendet werden.

Beispiel:

beforeParamsSave: (ctx, params, previousParams) => {
  // Parametervalidierung
  if (!params.eventType) {
    throw new Error('Event type is required');
  }
  
  // Parametertransformation
  params.eventType = params.eventType.toLowerCase();
  
  // Änderungen protokollieren
  console.log('Event params changed:', {
    from: previousParams,
    to: params
  });
}

#afterParamsSave

Typ: (ctx: FlowSettingsContext<TModel>, params: any, previousParams: any) => void | Promise<void>
Erforderlich: Nein
Beschreibung: Die Hook-Funktion, die nach dem Speichern der Parameter ausgeführt wird.

Wird ausgeführt, nachdem Ereignisparameter gespeichert wurden, und kann zum Auslösen anderer Aktionen verwendet werden.

Beispiel:

afterParamsSave: (ctx, params, previousParams) => {
  // Protokollieren
  console.log('Event params saved:', params);
  
  // Ereignis auslösen
  ctx.model.emitter.emit('eventConfigChanged', {
    eventName: 'clickEvent',
    params,
    previousParams
  });
  
  // Cache aktualisieren
  ctx.model.updateCache('eventConfig', params);
}

#uiMode

Typ: StepUIMode | ((ctx: FlowRuntimeContext<TModel>) => StepUIMode | Promise<StepUIMode>)
Erforderlich: Nein
Beschreibung: Der UI-Anzeigemodus für das Ereignis.

Steuert, wie das Ereignis in der Benutzeroberfläche angezeigt wird.

Unterstützte Modi:

  • 'dialog' - Dialogmodus
  • 'drawer' - Schubladenmodus
  • 'embed' - Einbettungsmodus
  • Oder ein benutzerdefiniertes Konfigurationsobjekt

Beispiel:

// Einfacher Modus
uiMode: 'dialog'

// Benutzerdefinierte Konfiguration
uiMode: {
  type: 'dialog',
  props: {
    width: 600,
    title: 'Event Configuration'
  }
}

// Dynamischer Modus
uiMode: (ctx) => {
  return ctx.model.isMobile ? 'drawer' : 'dialog';
}

#Integrierte Ereignistypen

Die FlowEngine verfügt über die folgenden integrierten gängigen Ereignistypen:

  • 'click' - Klick-Ereignis
  • 'submit' - Sende-Ereignis
  • 'reset' - Zurücksetzungs-Ereignis
  • 'remove' - Lösch-Ereignis
  • 'openView' - Ansicht-öffnen-Ereignis
  • 'dropdownOpen' - Dropdown-öffnen-Ereignis
  • 'popupScroll' - Popup-Scroll-Ereignis
  • 'search' - Such-Ereignis
  • 'customRequest' - Benutzerdefiniertes Anfrage-Ereignis
  • 'collapseToggle' - Zusammenklappen-Umschalt-Ereignis

#Vollständiges Beispiel

class FormModel extends FlowModel {}

// Formular-Sende-Ereignis registrieren
FormModel.registerEvent({
  name: 'formSubmitEvent',
  title: 'Formular-Sende-Ereignis',
  handler: async (ctx, params) => {
    const { formData, validation } = params;
    
    try {
      // Formulardaten validieren
      if (validation && !validateFormData(formData)) {
        throw new Error('Form validation failed');
      }
      
      // Formularübermittlung verarbeiten
      const result = await submitForm(formData);
      
      return {
        success: true,
        data: result,
        message: 'Form submitted successfully'
      };
    } catch (error) {
      return {
        success: false,
        error: error.message
      };
    }
  },
  defaultParams: {
    validation: true,
    preventDefault: true,
    stopPropagation: false
  },
  uiSchema: {
    'x-component': 'Form',
    properties: {
      validation: {
        type: 'boolean',
        title: 'Validierung aktivieren',
        'x-component': 'Switch',
        'x-decorator': 'FormItem',
        default: true
      },
      preventDefault: {
        type: 'boolean',
        title: 'Standardverhalten verhindern',
        'x-component': 'Switch',
        'x-decorator': 'FormItem',
        default: true
      },
      stopPropagation: {
        type: 'boolean',
        title: 'Propagation stoppen',
        'x-component': 'Switch',
        'x-decorator': 'FormItem',
        default: false
      },
      customHandlers: {
        type: 'array',
        title: 'Benutzerdefinierte Handler',
        'x-component': 'ArrayItems',
        'x-decorator': 'FormItem',
        items: {
          type: 'object',
          properties: {
            name: {
              type: 'string',
              title: 'Handler-Name',
              'x-component': 'Input'
            },
            enabled: {
              type: 'boolean',
              title: 'Aktiviert',
              'x-component': 'Switch'
            }
          }
        }
      }
    }
  },
  beforeParamsSave: (ctx, params) => {
    if (params.validation && !params.formData) {
      throw new Error('Form data is required when validation is enabled');
    }
  },
  afterParamsSave: (ctx, params) => {
    ctx.model.emitter.emit('formEventConfigChanged', params);
  },
  uiMode: 'dialog'
});

// Datenänderungsereignis registrieren
FormModel.registerEvent({
  name: 'dataChangeEvent',
  title: 'Datenänderungsereignis',
  handler: async (ctx, params) => {
    const { field, oldValue, newValue } = params;
    
    try {
      // Datenänderung protokollieren
      await logDataChange({
        field,
        oldValue,
        newValue,
        timestamp: Date.now(),
        userId: ctx.model.uid
      });
      
      // Verwandte Aktionen auslösen
      ctx.model.emitter.emit('dataChanged', {
        field,
        oldValue,
        newValue
      });
      
      return {
        success: true,
        message: 'Data change logged successfully'
      };
    } catch (error) {
      return {
        success: false,
        error: error.message
      };
    }
  },
  defaultParams: (ctx) => ({
    logLevel: 'info',
    notify: true,
    timestamp: Date.now()
  }),
  uiMode: 'embed'
});

// Ereignisse in einem Workflow verwenden
FormModel.registerFlow({
  key: 'formProcessing',
  title: 'Formularverarbeitung',
  on: 'formSubmitEvent',
  steps: {
    validate: {
      use: 'validateFormAction',
      title: 'Formular validieren',
      sort: 0
    },
    process: {
      use: 'processFormAction',
      title: 'Formular verarbeiten',
      sort: 1
    },
    save: {
      use: 'saveFormAction',
      title: 'Formular speichern',
      sort: 2
    }
  }
});