In dieser Lektion werden wir uns darauf konzentrieren, wie man das Verhalten einer Komponente mit Regeln und Aktionen implementiert.
Wir haben bereits gelernt, dass Sie beim Erstellen Ihrer eigenen Komponenten Regeln schreiben, die aus einem Ausdruck und einer oder mehreren Aktionen bestehen. Die Aktion(en) wird (werden) ausgeführt, wenn der Ausdruck wahr ist.
Regel: Eine Regel besteht aus drei Elementen:
- ID: Regelbezeichner, der innerhalb eines Bereichs eindeutig sein muss
- Ausdruck: Bedingung, die diese Regel auslöst
- Aktionen: Verweise auf oder Definitionen von Aktionen, die ausgeführt werden, wenn diese Regel ausgelöst wird
Eine Regel wird auch immer einem Zustand zugeordnet:
Staaten
<onenter>
: Dies ist der erste Zustand, wenn ein Schritt eingegeben wird. Die Benutzeroberfläche ist in diesem Zustand nicht verfügbar, daher können Sie keine UI-bezogenen Aktionen verwenden. Wenn Sie jedoch Parameter initialisieren möchten, um sie für das UI-Mapping zu verwenden, ist dies der richtige Zustand dafür.<onresume>
: Der zweite Zustand, nach <onenter>. In diesem Zustand ist die Benutzeroberfläche verfügbar und Sie können das geladene Layout mit den Aktualisierungsaktionen der Benutzeroberfläche ändern.<onpause>
und <onleave>
: Diese Zustände treten immer dann auf, wenn Sie den aktuellen Schritt oder die gesamte Komponente mit Hilfe der Aktionen step_transition
oder finish_workflow
verlassen. Da die Übergänge nicht unterbrechbar sind, können Sie hier keine Regeln verwenden, die diese Aktionen nutzen. Im Zustandonpause sind die Ressourcen des Schrittes noch vorhanden ,
im Zustand onleave
nicht mehr.<Ereignis>
: Dies ist wahrscheinlich der wichtigste Zustand. Die in diesem Status definierten Regeln werden jedes Mal geprüft, wenn ein Ereignis verarbeitet wird. Alle Regeln, die sich auf Interaktionen mit dem Benutzer beziehen, werden in diesem Status definiert.
Die Regeln innerhalb eines Zustands werden in beliebiger Reihenfolge ausgewertet, so dass der Ausdruck einer Regel nicht davon abhängen sollte, ob eine andere Regel vor ihr geprüft wurde.
Andererseits werden die Aktionen innerhalb einer Regel in der Reihenfolge ausgeführt, in der Sie sie aufschreiben.
Reihenfolge der Bewertung/Durchführung:
- Die Regeln werden in beliebiger Reihenfolge geprüft.
- Die Aktionen innerhalb einer Regel werden in sequenzieller Reihenfolge ausgeführt.
Ausdrücke
Die allgemeine Struktur eines Ausdrucks setzt sich wie in jeder Programmiersprache aus Operanden (z. B. Kontextvariablen) und Operatoren (z. B. '=' oder '>') zusammen.
Unterstützte Operatoren: +, -, &&, ||, !, /, ==, >, >=, <, <=, %, *, !=
Schauen wir uns ein weiteres einfaches Beispiel aus der Komponente "Paginierter Text" an, das einen Text beliebiger Länge auf mehreren Seiten anzeigt:
<onevent>
<rule id="next_page">
<expression><![CDATA[
#{event:command} == 'NEXT_PAGE' && #{page} < #{numberofpages}
]]></expression>
<actions>
<action ref="next"/>
<action ref="settext"/>
</actions>
</rule>
</onevent>
Tipps und Tricks: Leerzeichen werden aus dem Ausdruck gelöscht, es sei denn, sie sind als Zeichenketten mit einfachen Anführungszeichen gekennzeichnet. Sie können also beliebig neue Zeilen verwenden, um Ihren Ausdruck lesbar zu machen.
Dieser Ausdruck wird wahr, wenn die Schaltfläche name="NEXT_PAGE"
gedrückt wird und die aktuelle Seite nicht die letzte Seite ist.
Sie haben vielleicht das <![CDATA[ ... ]]>-Tag
bemerkt, das den Ausdruck umgibt. Das Tag ist in diesem Fall erforderlich. Es handelt sich um ein XML-Schlüsselwort, das dem Parser mitteilt, dass der folgende Text kein Markup ist. Ohne das <![CDATA[ ... ]]>-Tag
würde dieser Ausdruck das XML unserer Komponente ungültig machen, da er die von XML reservierten Zeichen &
und <
enthält .
Tipps und Tricks: Fügen Sie allen Ihren Ausdrücken ein <![CDATA[ ... ]]>
Tag hinzu. Auf diese Weise müssen Sie nicht darüber nachdenken, ob Sie XML-reservierte Zeichen verwenden.
Veranstaltungen
Wenn sich Ihre Regel im Zustand <ein Ereignis>
eines Schritts befindet, können Sie auf Ereignisse reagieren und die Eigenschaften des Ereignisses in Ihrem Ausdruck verwenden. Die Struktur eines Ereignisses ist wie folgt:
{
"command": "...",
"device":
{
"modality": "...",
"name": "...",
"source": "...",
"descriptor": "..."
},
"payload":
{
"...": "...",
"error": "..."
}
}
Sie werden nur eine Teilmenge dieser Felder benötigen:
1. Befehl: Der Befehl dieses Ereignisses, z. B. "NEXT". Der Befehl kann z.B. einer ID in der Layout- oder Workflowbeschreibung Ihrer Komponente entsprechen. Beispiel: #{event:command} == 'CANCEL'
2. Gerät.Modalität: Die Quelle des Ereignisses. Auf dieses Feld kann mit einer Kurzschreibweise zugegriffen werden.
Der Ausdruck #{event(SPEECH):command=='NEXT' entspricht dem Ausdruck #{event:device.modality} == 'SPEECH' && #{event:command} == 'NEXT'. Die Modalität hängt vom Ereignisemitter ab. Beispiel, #{event:device.modality} == 'MENU_SELECTION'
3. Nutzlast: Die Struktur/Felder der Nutzlast sind abhängig von der Aktion/dem Handler, die/der das Ereignis auslöst. Beispiel: #{event:payload.amount}
4. payload.error: Enthält eine Fehlermeldung, wenn es eine gibt. Beispiel: #{event:payload.error}
Sie können die Ereignisquellen einschränken, um sicherzustellen, dass eine Regel nur dann ausgelöst wird, wenn das Ereignis durch eine bestimmte Eingabemodalität verursacht wird. Sie könnten zum Beispiel einen Sprachbefehl "NEXT" haben, mit dem die Mitarbeiter bestätigen können, dass sie ihre Arbeit an einer bestimmten Aufgabe oder einem bestimmten Produkt beendet haben. Sie könnten auch ein Gerät verwenden, das ein Ereignis mit dem Befehl "NEXT" auslöst. Wenn eine Hardwaretaste gedrückt wird, dreht sie sich durch die verfügbaren Optionen auf dem Bildschirm. Sie möchten die Regel nicht aktivieren, wenn die Hardware-Tasten verwendet werden, also geben Sie die Modalität an: #{event(SPEECH):command} == 'NEXT'.
Allgemeine Ereignisquellen (Modalitäten): SPRACHE, GESTEN, TASTATUR, BARCODE, HW_KEYS, CAMERA_PICTURE, MENU_SELECTION, MEDIA_INPUT
Beispiele
Gehen wir einige Regelkonstrukte durch, die relativ häufig vorkommen:
Initialisierung und Tear-Down
Unser erstes Beispiel befasst sich mit einem typischen Anwendungsfall: Automatisches Ausführen von Aktionen beim Betreten oder Verlassen einer Komponente.
Tipps und Tricks: Einige Regeln müssen bedingungslos ausgeführt werden. Zu diesem Zweck können Sie den Ausdruck auf <Ausdruck>1</ausdruck>
setzen .
<onresume>
<rule id="init">
<expression>1</expression>
<actions>
<action ref="reset_counter"/>
</actions>
</rule>
</onresume>
Sequentielle Ausführung von Regeln
Regeln innerhalb eines Zustands werden in beliebiger Reihenfolge ausgewertet. In manchen Situationen ist es erforderlich, dass die Regeln innerhalb desselben Schritts nacheinander ausgeführt werden. Hierfür können Sie einen Timer verwenden, um die Regeln in der richtigen Reihenfolge auszulösen. Die Timer-Aktion löst manuell ein Ereignis mit einem benutzerdefinierten Befehl aus.
Als letzte Aktion der ersten Regel fügen Sie eine Timer-Aktion hinzu. Der benutzerdefinierte Befehl kann dann zum Ausdruck der zweiten Regel hinzugefügt werden.
<onevent>
<rule id="first_rule">
<expression><![CDATA[ #{event:command}=='VALID' ]]></expression>
<actions>
<action ref="do_something"/>
<setvar id="increment_counter">
<context_of>workflow</context_of>
<context_update>
<param name="counter" type="long">#{counter} + 1</param>
</context_update>
</setvar>
<timer id="check_counter_trigger" command="CHECK_COUNTER" delay="0"/>
</actions>
</rule>
<rule id="second_rule">
<expression><![CDATA[ #{event:command}=='CHECK_COUNTER' && #{counter} >= #{max_iterations} ]]></expression>
<actions>
<finish_workflow id="exit"/>
</actions>
</rule>
</onevent>
Zuweisung
Lassen Sie uns in Aktion treten:
Aufgabe 1:
In unserer "Choice"-Komponente haben wir das <![CDATA[ ... ]]>-Tag
nicht verwendet, um die Komponente für den Lernanfänger so einfach wie möglich zu halten. Wir empfehlen, das Tag in allen Ausdrücken zu verwenden, um eine potenzielle Fehlerquelle zu beseitigen.
- Fügen Sie den
<![CDATA[ ... ]]>
Tag zu unserer bestehenden Regel hinzu.
Aufgabe 2:
Stellen wir sicher, dass der Benutzer von seiner Wahl überzeugt ist. Wenn zum Beispiel, sobald wir "Apfel" wählen, Apfelkuchen produziert werden, möchten wir vielleicht, dass der Benutzer seine Wahl noch einmal bestätigt:
- Lesen Sie mehr über die Aktion ui_dialog
- Fügen Sie der Komponente einen Dialog hinzu, der den ausgewählten Wert anzeigt und den Benutzer auffordert, seine Auswahl zu bestätigen.
Download Workflow (Vorabzuweisung)
Hilfe und Ressourcen
- Für Aufgabe 2 müssen Sie eine neue Regel erstellen, die auf den
<Befehl>
der ui_dialog
Optionen reagiert. Ein Teil der Logik der bestehenden Regel muss in diese neue Regel verschoben werden.
Lösung
Download-Komponente (Post-Assignment)
Damit haben Sie die vierte Lektion abgeschlossen. In der fünften Lektion werden wir uns mit einigen Einschränkungen bei der Definition von Workflows nur mit XML befassen und wie Sie JavaScript in Workflows einsetzen können, um diese Probleme zu lösen.