Last Modified:
XMLコンポーネントをスクリプトから生成する #NativeScript #TypeScript
- tns-core-modules 6.5.2
問題
XMLからコンポーネントを生成する処理を、スクリプトから実行したい。
公式ドキュメントに書かれてそうだけど、 The Basics - NativeScript Docs なんか微妙に書かれてるような書かれてないような、そしてうまく動かないような。
ググって見つけたのがこれで、 NativeScriptでxmlからViewを作成する+ListViewでの実践 - Qiita ただ builder のソースを眺めたときと雰囲気が違ったので、ちゃんと調べました。
解決
今の NativeScript だとこんな感じで書けるみたいです。
import { Builder } from "@nativescript/core/ui/builder";
import { sanitizeModuleName } from "@nativescript/core/ui/builder/module-name-sanitizer";
import { View } from "@nativescript/core/ui/core/view";
export function inflateLayout(moduleName: string, bindingContext?: any): View {
const exports = global.loadModule(sanitizeModuleName(moduleName));
const view = Builder.load(moduleName, exports);
view.bindingContext = bindingContext;
return view;
}
漁ったコードはこの辺りです。
- https://github.com/NativeScript/NativeScript/blob/release-6.5.2/nativescript-core/ui/builder/builder.ts
- https://github.com/NativeScript/NativeScript/blob/release-6.5.2/nativescript-core/ui/builder/component-builder/component-builder.ts
- https://github.com/NativeScript/NativeScript/blob/release-6.5.2/nativescript-core/ui/builder/module-name-sanitizer.ts
- https://github.com/NativeScript/NativeScript/blob/release-6.5.2/nativescript-core/module-name-resolver/module-name-resolver.ts
-
ここにあった
global.getRegisteredModules()
で、ロード済みモジュールの一覧を確認したのが解決の糸口になった感じ。