これらのプロパティを使用すると、コンポーネントを接続して、相互に作用させることができます。原理はやや単純です。別のコンポーネントから値をインポート(取得)するか、別のコンポーネントに値をエクスポート(送信)するか、その両方を行います。
注:この回答の明確さを維持するために、「コンポーネント」はRequireJSによって返されるJavaScriptオブジェクトであり、特定の名前があり、UIRegistryを介してその名前でアクセスできます。
さらに、以下のすべての例defaults: {}
はコンポーネントのプロパティ内にあります。
原則が説明されたところで、私が最も簡単な概念と考えるものから始めましょう。
輸入
このプロパティは、別のコンポーネントから値を取得し、指定されたプロパティに割り当てます。次の例では、インポートを宣言しています。
imports: {
message: '${ $.provider }:data.message'
}
Magentoがこのコンポーネントを初期化すると、message
プロパティに値を割り当てようとします。このプロパティはKnockoutJSコンテキストで使用できます。ただし、ご存じのとおり、imports.message
最初に値をテンプレートリテラル式として評価します。この場合、Magentoはを解析し$.provider
、値を取得する必要があります。これはいくつでもかまいませんが、この例では、Magentoのコアユースケースの多くによれば、UIレジストリにあるコンポーネントの名前です。これは次のステップの前に解析されます。
以来message
プロパティがであるimports
財産、それはに渡されますsetLinks()
における方法uiElement.initLinks()
。setLinks()
この方法はですMagento/Ui/view/base/web/js/lib/core/element/links.js
。そこで、message
渡されたオブジェクト(imports
この場合)のすべてのプロパティ(ここのみ)をループします。これらのプロパティでは、コンポーネント間でデータを転送しようとします。
transfer()
関数は、関心の次の場所です。ここでは、インポートの場合、「所有者」であるコンポーネントがレジストリで検索されます。このコンポーネントは、現在「所有」しているか、データを持っているコンポーネント$.provider
であり、上記の例ではになります。コンポーネントが見つかると、データとsetLink()
関数をリンクします。
このメソッドには2つの注意点があります。1つはプロパティにイベントリスナーを設定すること、もう1つは、該当するフラグが送信された場合にデータをすぐに転送することです。私のテストでは、immediate
初期化中に転送が行われるように、常にパラメーターを渡しました。ただし、最初のステップでアタッチされたイベントリスナーのため、値が変更された場合、値が更新され続け、両方のコンポーネントの同期が維持されます。
次に、そのimports: {}
プロパティを持つコンポーネントにデータを設定します(簡単に言うと、「に戻る」)。私は先に述べたように、それはそれを宣言したコンポーネントのプロパティに直接割り当てられている-基本的にthis.message
上記の例ではありませんthis.defaults.imports.message
。その結果、data-bind="text: message
リンクされたコンポーネントのdata.message
プロパティから返された値が表示されます。
このアプローチでは、ソースコンポーネント内のプロパティ名を定義できます。上記の例alertMessage: ...
でmessage
は、コンポーネントのプロパティ名としての代わりにを使用できます。
輸出
エクスポートはの逆ですimports
。これらはインポートと同じ機能に基づいていますが、1つのコンポーネントからデータを取得してそれ自体に割り当てるのではなく、独自のデータを別のコンポーネントに送信します。その結果、ほとんどすべてが反対です。この例を見てみましょう:
exports: {
phoneNumber: '${ $.contactForm }:phone'
}
この例でsetLinks()
は、このコンポーネントのphoneNumber
プロパティの値を取得して、連絡先フォームのphone
プロパティに割り当てます。これは、コンポーネントでphone
プロパティを明示的に宣言することと同じ$.contactForm
です。で特別な設定をしなくても$.contactForm
、このデータに直接アクセスできます。たぶん、Knockoutテンプレートでは次のようになりdata-bind="text: phone
ます。
リンク集
最後に、このlinks
プロパティは、同じプロパティに対して両方imports
を宣言exports
するのと同じです。一見すると、これは循環参照のように見えるかもしれません。それはある意味ではありますが、これが役立つ場合があります。さらに多くのユースケースがあると確信していますが、私が見ることができるのは、あるコンポーネントが別のコンポーネントのデータを動的に操作する機能です。この場合、ComponentAは一部のデータのソースであり、ページに表示されます。ComponentBはそのデータを操作する必要があるためlinks
、そのプロパティを使用します。ComponentAを拡張または変更することなく、ComponentAでデータを表示し、実際のデータを操作できます。
ただし、デフォルトでlinks
は、他の2つのモジュールを接続する方法ではないことに注意してください。言い換えれば、ComponentCはlink
ComponentAからComponentBへは移行できません。これは、あるコンポーネントを別のコンポーネントと双方向で同期する方法です。
(リンクimports
、exports
およびlinks
)は、ほとんどの場合だけでなく、これらのプロパティに割り当てられた機能を容易にすることができます。オブザーバブルを作成して使用しているときに奇妙な動作に遭遇しましたlinks
が、全体としては非常にうまくいきました。
リンクは、KnockoutJSスコープで使用可能な値を提供し、他のプロパティと同じように操作できます。そして、明確に繰り返すために:ことを覚えておいてくださいimports
、exports
と、links
オブジェクトのキーを常にのプロパティを参照現在のコンポーネントの名前とプロパティに値が関係しながら、(これらのプロパティが宣言された1)リモート・コンポーネント。
結論として、Magentoはこのリンク機能を使用して、さまざまなコンポーネントを相互に接続します。これは、他のコンポーネントとデータにアクセス、提供、または同期できる方法です。