Mit diesen Eigenschaften können Komponenten verbunden werden, damit sie miteinander interagieren können. Das Prinzip ist etwas einfach: Importieren (Nehmen) eines Werts von einer anderen Komponente oder Exportieren (Senden) eines Werts an eine andere Komponente oder beides.
Hinweis: Um die Übersichtlichkeit dieser Antwort zu gewährleisten, ist eine "Komponente" ein Javascript-Objekt, das von RequireJS zurückgegeben wird, einen bestimmten Namen hat und über die UIRegistry unter diesem Namen aufgerufen werden kann.
Darüber hinaus befinden sich alle folgenden Beispiele in der defaults: {}
Eigenschaft der Komponente.
Beginnen wir mit dem dargelegten Prinzip mit dem, was ich für das einfachste Konzept halte:
Importe
Diese Eigenschaft nimmt einen Wert von einer anderen Komponente und weist ihn der angegebenen Eigenschaft zu. Im folgenden Beispiel deklarieren wir einen Import:
imports: {
message: '${ $.provider }:data.message'
}
Wenn Magento diese Komponente initialisiert, wird versucht, den Wert der message
Eigenschaft zuzuweisen . Diese Eigenschaft wird im KnockoutJS-Kontext verfügbar sein. Wie wir jedoch wissen , wird der imports.message
Wert zuerst als Vorlagenliteralausdruck ausgewertet . In diesem Fall analysiert Magento das $.provider
und sollte einen Wert erhalten. Während dies eine beliebige Anzahl von Dingen sein kann, ist dies in diesem Beispiel und gemäß vielen der wichtigsten Anwendungsfälle von Magento der Name einer Komponente, die sich in der UI-Registrierung befindet. Das wird vor dem nächsten Schritt analysiert.
Da sich die message
Eigenschaft in der imports
Eigenschaft befindet, wird sie an die setLinks()
Methode in übergeben uiElement.initLinks()
. Die setLinks()
Methode ist in Magento/Ui/view/base/web/js/lib/core/element/links.js
. Dort werden alle Eigenschaften (nur message
hier) des übergebenen Objekts ( imports
in diesem Fall) durchlaufen. In diesen Eigenschaften wird versucht, Daten von einer Komponente zur anderen zu übertragen.
Die transfer()
Funktion ist der nächste Ort von Interesse. Hier wird die Registrierung nach der Komponente durchsucht, die im Falle eines Imports der "Eigentümer" ist. Diese Komponente ist diejenige, die derzeit die Daten "besitzt" oder besitzt und die $.provider
im obigen Beispiel wäre. Wenn die Komponente gefunden wird, werden die Daten mit der setLink()
Funktion verknüpft .
Bei dieser Methode sind zwei Dinge zu beachten: Erstens wird ein Ereignis-Listener für die Eigenschaft festgelegt, und zweitens werden die Daten sofort übertragen, wenn das entsprechende Flag gesendet wurde. Bei meinen Tests wurde der immediate
Parameter immer übergeben , sodass die Übertragung während der Initialisierung erfolgte. Aufgrund des im ersten Schritt angehängten Ereignis-Listeners werden die Werte jedoch weiterhin aktualisiert, wenn sie sich ändern, sodass beide Komponenten synchron bleiben.
Die Daten werden dann auf die Komponente gesetzt (oder einfacher ausgedrückt: "an die" zurückgegeben "), die die imports: {}
Eigenschaft hatte. Wie bereits erwähnt, wird es dann direkt der Eigenschaft der Komponente zugewiesen, die es deklariert hat - im Wesentlichen this.message
im obigen Beispiel und nicht this.defaults.imports.message
. Infolgedessen data-bind="text: message
sollte der von der data.message
Eigenschaft der verknüpften Komponente zurückgegebene Wert angezeigt werden .
Mit diesem Ansatz können Sie definieren, wie der Eigenschaftsname in der Quellkomponente lautet. Im obigen Beispiel können Sie alertMessage: ...
statt message
als Eigenschaftsname Ihrer Komponente verwenden.
Exporte
Exporte sind die Umkehrung von imports
. Sie basieren auf der gleichen Funktionalität wie Importe, aber anstatt Daten von einer Komponente zu übernehmen und sich selbst zuzuweisen, sendet sie ihre eigenen Daten an eine andere Komponente. Infolgedessen ist fast alles das Gegenteil. Nehmen Sie dieses Beispiel:
exports: {
phoneNumber: '${ $.contactForm }:phone'
}
In diesem Beispiel wird setLinks()
der Wert der Eigenschaft dieser Komponente verwendet und der phoneNumber
Eigenschaft des Kontaktformulars phone
zugewiesen. Dies entspricht der expliziten Deklaration einer phone
Eigenschaft in der $.contactForm
Komponente. Ohne eine bestimmte Einrichtung in der $.contactForm
können Sie dann direkt auf diese Daten zugreifen. Vielleicht so in einer Knockout-Vorlage : data-bind="text: phone
.
Links
Schließlich ist die links
Eigenschaft dieselbe wie die Deklaration beider imports
und exports
für dieselbe Eigenschaft. Auf den ersten Blick mag dies wie ein Zirkelverweis erscheinen. In gewisser Weise kann dies hilfreich sein. Ich bin mir zwar sicher, dass es noch viele weitere Anwendungsfälle gibt, aber ich kann sehen, dass eine Komponente Daten von einer anderen Komponente dynamisch bearbeiten kann. In diesem Fall ist ComponentA die Quelle einiger Daten und zeigt diese auf der Seite an. ComponentB muss diese Daten und damit diese links
Eigenschaft bearbeiten. Es kann sowohl die Daten anzeigen als auch die tatsächlichen Daten in ComponentA bearbeiten, ohne ComponentA jemals zu erweitern oder zu ändern.
Zu beachten ist jedoch, dass standardmäßig links
keine Möglichkeit besteht, zwei andere Module miteinander zu verbinden. Mit anderen Worten, ComponentC kann link
ComponentA nicht zu ComponentB. Es ist eine Methode zum bidirektionalen Synchronisieren einer Komponente mit einer anderen.
Die Verknüpfung ( imports
, exports
und links
) können erleichtern fast immer Funktionen als auch auf jene Eigenschaften zugeordnet. Ich bin beim Erstellen und Verwenden von Observablen auf ein seltsames Verhalten gestoßen, links
aber insgesamt hat es ganz gut funktioniert.
Die Verknüpfung enthält Werte, die im KnockoutJS-Bereich verfügbar sind und wie jede andere Eigenschaft bearbeitet werden können. Und wiederholen klar: nicht vergessen , dass das imports
, exports
und Objektschlüssellinks
immer auf Eigenschaften des beziehen Stromkomponente (die, in der diese Eigenschaften erklärt wurden), während der Wert bezieht sich auf den Namen und die Eigenschaften der Remote - Komponente .
Zusammenfassend lässt sich sagen, dass Magento diese Verknüpfungsfunktion verwendet, um verschiedene Komponenten miteinander zu verbinden. Auf diese Weise können wir auf Daten zugreifen, diese bereitstellen oder mit anderen Komponenten synchronisieren.