私がプロジェクトで行っていることは、基本ビューモデル クラスを使用して、サーバーからのテキスト データの取得を処理することです。各ビューモデルには、サーバーで使用されるリソース ID と一致する独自の ID があります。フェッチされたテキストは、次のような構造で基本ビューモデル クラスに保持されます。
public texts: KnockoutObservableArray<ITextItem> = ko.observableArray<ITextItem>();
.. ITextItemは次のような構造です。
interface ITextItem {
id: string;
value: KnockoutObservable<string>;
}
.. 次のような関数で取得します。
public updateTexts(cultId: string): Q.Promise<any> {
if (this.textsName === '')
this.textsName = this.modelId;
if (this.lastCultureIdFetched != cultId) {
this.lastCultureIdFetched = cultId;
return mm_cspData.cspCtx.getTexts(this.textsName, this.texts);
}
else
return Q.resolve(true);
}
.. 次のようにビューモデル内から取得された特定のテキスト:
public tx(id: string): string {
var match: ITextItem = ko.utils.arrayFirst(this.texts(), item=> item.id === id);
if (!match)
return '';
else
return match.value();
}
したがって、ビューモデルがアクティブ化されるか、アプリケーション言語が変更されるたびに、updateTextメソッドがトリガーされます。
HTML ビューにテキストを表示するには、ノックアウト バインディング ハンドラーを使用してビューモデルから正しいテキストを取得します。原則として、各ビューモデルはvmという名前の変数にエクスポートされるため、次のようにして問題を解決します。
ko.getVmTx = (label: any, bindingContext: any) : string => {
if (label === null)
return '';
var vm: any;
var labelId;
if (typeof label === 'object' && typeof label.vm === 'object' && typeof label.vm.tx !== 'function') {
vm = label.vm;
labelId = label.tx;
} else {
vm = bindingContext.$root.vm;
labelId = ko.unwrap(label);
}
if (vm === null || typeof vm === 'undefined' || typeof vm.tx !== 'function') {
console.log('tx binding: unable to find vm for ' + label);
return '';
}
else
return vm.tx(labelId);
}
ko.bindingHandlers.tx = {
update: (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) => {
$(element).text(ko.getVmTx(valueAccessor(),bindingContext));
}
};
ko.bindingHandlers.txVal = {
update: (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) => {
$(element).val(ko.getVmTx(valueAccessor(), bindingContext));
}
};
最後に、私のビューでは、次のようなバインディング ハンドラーを使用します。
<span class="app-badge-label-bg" data-bind="tx: 'FinInvAmount'"></span>
これは大規模なセットアップですが、一度配置すると、テキスト処理は基本ビューモデル クラスによって処理され、各ビューモデルに対して行う必要があるのは、サーバー側でリソース ファイルをセットアップしてデータ バインドすることだけです。シンプルなノックアウト バインディングでラベルと値を作成します。