2016-07-11 3 views
4

NativeScriptプロジェクトのカスタムコンポーネントからメソッドを公開したいと考えています。NativeScriptカスタムコンポーネントからメソッドを公開するにはどうすればよいですか?

MyComponent.xml <StackLayout loaded="loaded"> ...UI markup... </StackLayout>

MyComponent.ts export function loaded(args) { //do stuff }; export function myCustomMethod() { //do more stuff };

MyPage.xml <Page xmlns:widget="..." loaded="loaded"> <widget:MyComponent id="myComponent" /> </Page>

MyPage.ts 0123:ここでは概念的な設定です export function loaded(args) { let page = <Page>args.object; let widget = page.getViewById("myComponent"); widget.myCustomMethod(); //<--THIS DOES NOT WORK }

質問:カスタムコンポーネントでmyCustomMethodを適切に公開して、ホスティングページがJavaScript経由でアクセスして呼び出す方法を教えてください。

デフォルトでは、ページ上のカスタムコンポーネントへの参照を取得しようとすると、カスタムコンポーネントのレイアウトコンテナへの参照が返されます(この例では、StackLayout)。

MyComponent.ts export function loaded(args) { let stackLayout = <StackLayout>args.object; //Layout container stackLayout.myCustomMethod = myCustomMethod; //Attach custom method to StackLayout }

それはハックの少しですが、それは働いている:

ので、回避策として、私はこれをやっています。レイアウトコンテナのスーパークラスを作成するのに手間がかからないカスタムコンポーネントメソッドを公開する方法はありますか?より正確に

UPDATE

、カスタムコンポーネントは、インスタンスのプロパティを持っているので、最終的な解決策は、シナリオなどをサポートする必要があるだろう...

MyComponent.ts let isStarted = false; export function loaded(args){ // do stuff }; export function myCustomMethod() { isStarted = true; };

+0

私はこれに興味があります –

+0

Todd any solution nowaday? –

+0

TypeScriptに切り替えることで、これはかなり自然に/解決しやすくなりました。今日私は "ビジュアル"カスタムコンポーネントを持っている場合、私は通常、StackLayoutを拡張し、新しいパブリックメソッド/プロパティを追加します。ですから、NativeScriptでTypeScriptを使用することをお勧めします。 – Todd

答えて

0

再利用したいメソッドがcustomCompoenentに結合されていないので、共通ファイルを作成し、必要な場所にそれを必要とし、それに応じて公開メソッドを再利用することができます。例えば

(おそらくなどonLoaded、onNavigationgTo、のようなあなたのMyCompoennt.tsの全て公開されたメソッドにアクセスする必要がありますようではないので、良いアイデア)または、直接あなたのMyComponent.tsをインポートし、そのエクスポートされたメソッドを再利用することができます

をあなたの navigator.tsで

(または、あなたのMyComponent.tsすることを好む場合)

import frame = require("ui/frame"); 
export function navigateBack() { 
    frame.goBack(); 
} 

をし、このように必要な場合、それを再利用:

MyPage。TS

import navigatorModule = require("navigator"); 

export function goBack(args: observable.EventData) { 
    navigatorModule.goBack(); // we are reusing goBack() from navigator.ts 
} 

別の該当するオプションは、MVVMパターンを使用し、バインディング・コンテキストを経由してあなたの方法を公開することです。

+0

私はこれを実験します。最終的に、私の場合、カスタムコンポーネントの "インスタンス"状態が存在します。このアプローチがうまくいくかどうかはわかりませんが、調査して報告します。ありがとう! – Todd

関連する問題