Datensätze in einer virtuellen DOM-App von Oracle JET aktualisieren
Einführung
In diesem Tutorial erfahren Sie, wie Sie mit Ihrer virtuellen DOM-App von Oracle JavaScript Extension Toolkit (Oracle JET) einen vorhandenen Datensatz aktualisieren und an einen REST-Service weiterleiten.
Ziele
In diesem Tutorial erfahren Sie, wie Sie einen vorhandenen Datensatz aktualisieren und an einen REST-Service weiterleiten.
Voraussetzungen
- Eine Entwicklungsumgebung zum Erstellen virtueller Oracle JET-DOM-Apps, die eine Installation von Node.js umfasst
- Abschluss des vorherigen Tutorials in diesem Lernpfad: Formular zum Erstellen von Datensätzen in einer virtuellen Oracle JET-DOM-App erstellen
Aufgabe 1: Komponenten zur Verwaltung von Formularinformationen erstellen
Erstellen Sie eine neue Komponente, die ein Dialogfeld anzeigt, in dem Sie die Funktionalität zum Aktualisieren eines Records aufrufen können.
-
Navigieren Sie zum Verzeichnis
JET-Virtual-DOM-app/src/components/ActivityItem
, erstellen Sie eine neue DateiEditItemDialog.tsx
, und öffnen Sie sie in einem Editor. -
Fügen Sie die Platzhaltereinträge hinzu, die einen Funktionsnamen (
EditItemDialog
) für die neue Komponente definieren.import { h } from "preact"; type Props = { message?: string; }; const EditItemDialog = (props: Props) => { return ( <div class="oj-web-applayout-max-width oj-web-applayout-content"> <p>content</p> </div> ); }; export default EditItemDialog;
Aufgabe 2: Dialog öffnen
Deklarieren Sie den Typ und die Funktion in der Komponente ItemActionsContainer
, um die Komponente EditItemDialog
aufzurufen, die die Funktionalität zum Aktualisieren eines Datensatzes enthält.
-
Navigieren Sie zum Verzeichnis
JET-Virtual-DOM-app/src/components/ActivityItem
, und öffnen Sie die DateiItemActionsContainer.tsx
. -
Importieren Sie oben in der Datei die Hooks
useState
unduseEffect
Preact, definieren Sie die zusätzlichen Eigenschaften in einem Alias des TypsProps
, den Sie zur Verwendung der KomponenteEditItemDialog
benötigen, und definieren Sie dann einen Alias des TypsItem
.import { h } from "preact"; import "ojs/ojbutton"; import { useState, useEffect } from "preact/hooks"; type Props = { create: () => void; edit: () => void; itemSelected: Partial<Item>; }; type Item = { id: number; name: string; short_desc?: string; price?: number; quantity?: number; quantity_shipped?: number; quantity_instock?: number; activity_id?: number; image?: string; };
-
Verwenden Sie vor der
return
-Anweisung die Preact-Hooks, die Sie importiert haben, um zu bestimmen, ob ein Aktivitätselement ausgewählt ist.const ItemActionsContainer = (props: Props) => { const [hideActions, setHideActions] = useState<boolean>(true); if (props.itemSelected?.id) { console.log("Selected: " + JSON.stringify(props.itemSelected)); } useEffect(() => { if (props.itemSelected?.id) { setHideActions(false); } else { setHideActions(true); } }, [props.itemSelected]); return (
-
Fügen Sie in der Anweisung
return
ein neuesoj-button
-Element mit einemonojAction
-Attribut hinzu, das die Eigenschaftedit
referenziert.const ItemActionsContainer = (props: Props) => { return ( <div> <oj-button id="createButton" onojAction={props.create}>Create</oj-button> <oj-button id="updateButton" disabled={hideActions} onojAction={props.edit}>Update</oj-button> </div>
Speichern Sie die Datei
ItemActionsContainer.tsx
. Ihr Code sollteItemActionsContainer.tsx.txt
ähneln -
Importieren Sie oben in der Datei
EditItemDialog.tsx
die Module für die Oracle JET Dialog-Komponente sowie die HooksuseRef
,useEffect
,MutableRef
unduseState
Preact.import { h } from "preact"; import { useRef, useEffect, useState, MutableRef } from "preact/hooks"; import "ojs/ojdialog"; import { ojDialog } from "ojs/ojdialog";
-
Erstellen Sie im Alias des Typs
Props
die folgenden Eigenschaften.type Props = { isOpened: boolean; closeDialog: (ref: MutableRef<ojDialog>, type: string) => void; editItem: (data: Partial<Item>, ref: MutableRef<ojDialog>) => void; itemData: Partial<Item>; };
-
Ersetzen Sie in der
return
-Anweisung das vorhandenediv
-Element durch einspan
-Element, das das benutzerdefinierteoj-dialog
-Element umschließt.return ( <span> <oj-dialog id="editDialog" ref={editDialogRef as MutableRef<ojDialog>} dialogTitle="Update Item Details" onojClose={closeDialog} cancelBehavior="icon"> <div slot="body"> <oj-label-value labelEdge="inside"> <oj-label for="itemid" slot="label"> Item ID </oj-label> <div id="itemid" slot="value" class="slot-line"> {editFormData?.id} </div> </oj-label-value> <oj-form-layout> <oj-input-text id="name" labelHint="Name" onvalueChanged={onChangeHandler} value={editFormData?.name}></oj-input-text> <oj-input-text id="price" labelHint="Price" onvalueChanged={onChangeHandler} value={editFormData?.price}></oj-input-text> <oj-input-text id="short_desc" labelHint="Description" onvalueChanged={onChangeHandler} value={editFormData?.short_desc}></oj-input-text> </oj-form-layout> </div> <div slot="footer"> <oj-button id="submitBtn" onojAction={editItem}> Submit </oj-button> </div> </oj-dialog> </span> );
-
Fügen Sie vor der Anweisung
return
die Methoden hinzu, mit denen die Attributwerte in den untergeordneten benutzerdefinierten Elementen der benutzerdefinierten Elementreferenzoj-dialog
angegeben werden. Beispiel: Die MethodeonChangeHandler
wird aufgerufen, wenn eine Komponenteoj-input-text
eine Änderung über das AttributonvalueChanged
erkennt.const EditItemDialog = (props: Props) => { const editDialogRef = useRef<ojDialog>(); const [editFormData, setEditFormData] = useState<Partial<Item>>({}); const onChangeHandler = (event: any) => { if (event.detail.updatedFrom === "internal") { setEditFormData({ ...editFormData, [event.currentTarget.id]: event.detail.value, }); } }; const closeDialog = () => { props.closeDialog(editDialogRef as MutableRef<ojDialog>, "edit"); }; const editItem = () => { console.log("data: " + JSON.stringify(editFormData)); props.editItem(editFormData, editDialogRef as MutableRef<ojDialog>); }; useEffect(() => { setEditFormData(props.itemData); props.isOpened ? editDialogRef.current?.open() : editDialogRef.current?.close(); }, [props.isOpened]); return (
-
Definieren Sie vor der Deklaration der Funktion
EditItemDialog
einen Alias des TypsItem
, der Felder für die Daten enthält, die Sie aktualisieren und an den REST-Service senden.type Item = { id: number; name: string | undefined; short_desc?: string; price?: number; quantity?: number; quantity_shipped?: number; quantity_instock?: number; activity_id?: number; image?: string; }; const EditItemDialog = (props: Props) => {
Speichern Sie die Datei
EditItemDialog.tsx
. Ihr Code sollteEditItemDialog.tsx.txt
ähneln
Aufgabe 3: Komponente EditItemDialog verbrauchen
-
Öffnen Sie die Datei
ActivityItemContainer.tsx
, und importieren Sie die KomponenteEditItemDialog
, die Sie in der letzten Aufgabe erstellt haben, sowie den Preact-HookMutableRef
und das Oracle JET-Modul für die Dialogkomponente.import { useState, useCallback, MutableRef, useRef } from "preact/hooks"; import EditItemDialog from "./EditItemDialog";
-
Aktualisieren Sie im
Props
-Typalias den Eintrag fürdata
, um denany
-Typ fürRESTDataProvider
zu unterstützen, und löschen oder kommentieren Sie denActivityItem
-Typ aus, den die Komponente nicht mehr verwendet.type Props = { data?: RESTDataProvider<any, any>; selectedActivity: Item | null; onItemChanged: (item: Item) => void; }; // type ActivityItem = { // id: number; // name: string; // items: Array<Item>; // short_desc: string; // image: string; // };
-
Aktualisieren Sie in der
return
-Anweisung das ElementItemActionsContainer
mit den AttributwertenitemSelected
undedit
. Fügen Sie nach dem ElementCreateNewItemDialog
ein neues Element für die KomponenteEditItemDialog
hinzu, die Sie importiert haben.<div id="container"> <h3>Activity Items</h3> <ItemActionsContainer create={openCreateDialog} itemSelected={activityItemValue} edit={openEditDialog} /> . . . </div> <CreateNewItemDialog isOpened={isCreateOpened} createNewItem={createItem} closeDialog={handleDialogClose} /> <EditItemDialog isOpened={isEditOpened} editItem={editItem} closeDialog={handleDialogClose} itemData={itemData} /> . . .
-
Fügen Sie vor der
return
-Anweisung die FunktionopenEditDialog
hinzu, um das Dialogfeld "Bearbeiten" zu öffnen, und die FunktioneditItem
, um das aktualisierte Aktivitätselement an den REST-Service zu senden.const openEditDialog = () => { console.log("Item: " + JSON.stringify(itemData)); setIsEditOpened(true); console.log("Edit dialog opened"); }; const editItem = async (newItemData:Partial<Item>, editDialogRef = useRef<ojDialog>()) => { if (newItemData != null) { const row = { itemId: newItemData.id, name: newItemData.name, price: newItemData.price, short_desc: newItemData.short_desc, }; // Create and send request to update row on rest service const request = new Request(`${restServerURLItems}${itemData.id}`, { headers: new Headers({ "Content-type": "application/json; charset=UTF-8", }), body: JSON.stringify(row), method: "PUT", }); const response = await fetch(request); const updatedRow = await response.json(); // Create update mutate event and call mutate method // to notify dataprovider consumers that a row has been // updated const updatedRowKey = itemData.id; const updatedRowMetaData = { key: updatedRowKey }; props.data?.mutate({ update: { data: [updatedRow], keys: new Set([updatedRowKey]), metadata: [updatedRowMetaData], }, }); } // End if statement console.log("Edited item"); editDialogRef.current?.close(); };
Speichern Sie die Datei
ActivityItemContainer.tsx
. Ihr Code sollteActivityItemContainer.tsx.txt
ähneln
Aufgabe 4: Code testen und Datensatz aktualisieren
-
Wechseln Sie im Terminalfenster in das Verzeichnis
JET-Virtual-DOM-app
, und führen Sie die virtuelle DOM-App aus.npx ojet serve
- Zeigen Sie im Browser die dynamischen Änderungen in Ihrer virtuellen DOM-App an.
- Klicken Sie in der virtuellen DOM-App auf die Baseball-Aktivität und dann auf das Element SureFire Ball (4er Set).
-
Klicken Sie auf die Schaltfläche Aktualisieren.
Das Dialogfeld "Elementdetails aktualisieren" wird angezeigt.
-
Ändern Sie den Preis von
20.5
in21
, und klicken Sie auf Weiterleiten.Der Abschnitt wird aktualisiert, und der Preis des Artikels wurde aktualisiert.
- Schließen Sie das Browserfenster oder die Registerkarte, in der die ausgeführte virtuelle DOM-App angezeigt wird.
- Drücken Sie im Terminalfenster Ctrl+C, und geben Sie bei entsprechender Aufforderung
y
ein, um den Batchjob für Oracle JET-Tooling zu beenden.
Nächsten Schritt
Fahren Sie mit dem nächsten Tutorial in diesem Modul fort.
Dieses Tutorial ist Teil des Moduls CRUD-Vorgänge mit einem REST-Service.
- Daten aus der REST-API in Oracle JET abrufen
- Formular zum Erstellen von Datensätzen in einer Oracle JET Virtual DOM-App erstellen
- Datensätze in einer Oracle JET Virtual DOM-App aktualisieren
- Datensätze in einer Oracle JET Virtual DOM-App löschen
Sie können zur Hauptseite des virtuellen DOM-Lernpfads zurückkehren, um auf alle Module zum Erstellen virtueller DOM-Apps zuzugreifen.
Weitere Lernressourcen
Sehen Sie sich weitere Übungen zu docs.oracle.com/learn an, oder greifen Sie auf weitere kostenlose Lerninhalte im Oracle Learning YouTube-Kanal zu. Besuchen Sie außerdem education.oracle.com/learning-explorer, um ein Oracle Learning Explorer zu werden.
Die Produktdokumentation finden Sie im Oracle Help Center.
Update data records in an Oracle JET virtual DOM app
F70654-02