UIコンポーネント間でKnockout JSオブザーバブルを共有する方法


12

次のようなUIコンポーネントプロパティの使用方法imports: {}exports: {}共有方法を理解しています。

defaults: {
    exports: {
        shouldShowMessage: '${$.component}'
    }
}

エクスポートでコンポーネント名を返します。

ここに画像の説明を入力してください

しかし、Knockoutオブザーバブルをエクスポートしようとすると、常に未定義になります。

defaults: {
    exports: {
        shouldShowMessage: '${$.shouldShowMessage}'
    }
}

...

setupKoBindings: function() {
    this.shouldShowMessage = ko.observable('Testing');
}

ここに画像の説明を入力してください

回避策として、ここで説明するようにストレージモデルを作成しますが、インポートとエクスポートを使用したいと思います。

回答:


12

exportsオブジェクトの値は、「:」で区切られたUiComponentインスタンスの名前とプロパティに解決される必要がありますcheckout.cart.total:title
エクスポートターゲット名には、UIコンポーネント「名前空間」を含める必要があります。

この例では、値を文字列に設定します。これは、エクスポートソースであるUiComponentのプロパティに解決されます。エクスポートは、有効なエクスポートターゲットではないため、検査すると未定義になります。

これが機能する例です:

defaults: {
    exportTarget: "foo.bar",
    exportTargetProperty: "showMessage",

    tracks: {
        shouldShowMessage: true
    },

    exports: {
        shouldShowMessage: '${$.exportTarget}:${$.exportTargetProperty}'
    }
}
...

上記は、値が変更されるたびに、shouldShowMessageプロパティの値をshowMessageフルネームのUiComponent のプロパティにコピーしますfoo.bar
これにより、ターゲットプロパティが自動的にKO監視可能になることにも注意してください。値の変更によってKOがトリガーされ、そのプロパティにアクセスするDOMノードが再レンダリングされる場合は、明示的に宣言する必要があります。

ちなみに、追加shouldShowMessagetracksたオブジェクトは、それKO-ES5に観察自動的に行います。リテラルを使用することko.observable()もできます。

上記の例では、exportTargetおよびexportTargetPropertyがで設定されていdefaultsます。それらは、JSONのUiComponentオプションの一部として指定することもできます。これは、UiComponent名を含むUiComponent階層が定義されている場所であるため、通常はより意味があります。

最後に、値オブジェクトを使用して値を他のUIコンポーネントに渡すソリューションは、エクスポートまたはインポートを使用するよりも個人的には良いと個人的に考えています。私の経験では、DOMまたはUiComponentsで共有状態を維持することは、最も単純な場合を除いて、スパゲッティOOPのレシピです。


素晴らしい説明、@ Vinaiに感謝!時間があるときに試してみて、問題がなければ動作可能としてマークします。
Ben Crook

を使用しているときにいくつかの問題が発生しましたtracks。手動でオブザーバブルをサブスクライブするとthis.shouldShowMessage.subscribe is not a function、使用時に機能しなくなりthis.shouldShowMessage.subscribe(function() { ... }); ます。tracks同じようにステップがない、またはオブザーバブルを作成していないかのように感じます。
ベン・クルック

そうです、プロパティはもはや通常のkoオブザーバブルではなく、ES5ゲッター/セッターのペアだけです。元の監視可能な関数にアクセスする場合は、koを注入して使用できますko.getObservable(this, 'shouldShowMessage').subscribe(function(newValue) { ...});(最初の引数はviewmodel(this)、2番目の引数は追跡されるプロパティの名前です。詳細はこちら:github.com/SteveSanderson/knockout-es5
Vinai

ああそれは理にかなっている、あなたは最高<3だ
ベン・クルック

1
インポートとエクスポートを試してみても失敗するが、これはスパゲッティコードであることに同意する。私はあきらめ、手動サブスクリプションとストレージモデルを使用することにした。
ベン・クルック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.