私は Knockout の経験が豊富ですが、コンポーネントを使用するのはこれが初めてなので、明らかな何かが欠けていることを本当に望んでいます! 私の問題を説明するために、ユースケースを少し単純化しようとします。
Index という HTML および JS ファイルがあります。Index.html にはコンポーネントのデータ バインドがあり、Index.js にはko.components.register
呼び出しがあります。
索引.html
<div data-bind="component: { name: CurrentComponent }"></div>
Index.js
var vm = require("SectionViewModel");
var CurrentComponent = ko.observable("section");
ko.components.register("section", {
viewModel: vm.SectionViewModel,
template: "<h3>Loading...</h3>"
});
ko.applyBindings();
次に、別の HTML および JS ファイル (Section.html および SectionViewModel.js) があります。上記でわかるように、SectionViewModel は、コンポーネントのビュー モデルとして指定したものです。
Section.html
<div>
<span data-bind="text: Section().Name"></span>
</div>
SectionViewModel.js
var SectionViewModel = (function() {
function SectionViewModel() {
this.Section = ko.observable();
$.get("http://apiurl").done(function (data) {
this.Section(new SectionModel(data.Model)); // my data used by the view model
ko.components.get("dashboard", function() {
component.template[0] = data.View; // my html from the api
});
});
}
return SectionViewModel;
});
exports.SectionViewModel = SectionViewModel;
SectionViewModel のコンストラクターの一部として、API を呼び出して、ビュー モデルに入力するために必要なすべてのデータを取得します。この API 呼び出しは、テンプレートで使用する必要がある HTML も返します (基本的には、Section.html から読み取られます)。
明らかに、このコンストラクターは applyBindings を呼び出すまで呼び出されないため、API 呼び出しの成功ハンドラーに入ると、コンポーネントのテンプレートは既に既定のテキストに設定されています。
私が知る必要があるのは、このテンプレートを更新することは可能ですか? 上記のように、成功ハンドラーで次のことを試しました。
ko.components.get("section", function(component) {
component.template[0] = dataFromApi.Html;
});
これにより、実際に既定のテキストが API から返された html に置き換えられますが (デバッグ ツールで見られるように)、この更新はブラウザーに反映されません。
基本的に、私が本当に求めているのは、バインド後にコンポーネント テンプレートのコンテンツを更新する方法はありますか?
あなたが考えるかもしれない上記を解決するオプションはテンプレートを要求することであることは知っていますが、私は上記を本当に単純化し、完全な実装ではこれを行うことができないため、なぜ HTML が API によって返されるのか.
どんな助けでも大歓迎です!現在、機能するソリューションがありますが、JSコードを構造化して機能させる方法が本当に好きではないため、上記のソリューションが理想的です。
ありがとう。