NativeScript-データバインディング
データバインディングは、NativeScriptでサポートされている高度な概念の1つです。NativeScriptは、Angularデータバインディングの概念に可能な限り準拠しています。データバインディングにより、UIコンポーネントは、プログラミングを行わなくても、アプリケーションデータモデルの現在の値を表示/更新できます。
NativeScriptは、2種類のデータバインディングをサポートしています。それらは次のとおりです-
One-Way data binding −モデルが変更されるたびにUIを更新します。
Two-Way data binding−UIとモデルを同期します。モデルが更新されるたびに、UIは自動的に更新され、UIがユーザーからデータを取得する(UIが更新される)たびに、モデルが更新されます。
このセクションでは、両方の概念を学びましょう。
一方向のデータバインディング
NativeScriptは、UIコンポーネントで一方向のデータバインディングを有効にする簡単なオプションを提供します。一方向のデータバインディングを有効にするには、ターゲットUIのプロパティに角かっこを追加してから、必要なモデルのプロパティを割り当てます。
たとえば、Labelコンポーネントのテキストコンテンツを更新するには、UIコードを次のように変更します-
<Label [text]='this.model.prop' />
ここに、
this.model.prop モデルのプロパティthis.modelを参照します。
一方向のデータバインディングを理解するためにBlankNgAppを変更しましょう。
ステップ1
次のように、新しいモデルUser(src / model / user.ts)を追加します-
export class User {
name: string
}
ステップ2
コンポーネントのUIを開き、 src/app/home/home.component.html 以下のようにコードを更新します-
<ActionBar>
<Label text="Home"></Label>
</ActionBar>
<GridLayout columns="*" rows="auto, auto, auto">
<Button text="Click here to greet" class="-primary" color='gray'
(tap)='onButtonTap($event)' row='1' column='0'>
</Button>
<Label [text]='this.user.name' row='2' column='0'
height="50px" textAlignment='center' style='font-size: 16px;
font-weight: bold; margin: 0px 32px 0 25px;'>
</Label>
</GridLayout>
ここに、
ラベルのテキストは、ユーザーモデルのプロパティ名に設定されます。
ボタンタップイベントはonButtonTapメソッドにアタッチされます。
ステップ3
ホームコンポーネントのオープンコード、 src/app/home/home.component.ts 以下のようにコードを更新します-
import { Component, OnInit } from "@angular/core";
import { User } from "../../model/user"
@Component({
selector: "Home",
templateUrl: "./home.component.html"
})
export class HomeComponent implements OnInit {
public user: User;
constructor() {
// Use the component constructor to inject providers.
this.user = new User();
this.user.name = "User1";
}
ngOnInit(): void {
// Init your component properties here.
}
onButtonTap(args: EventData) {
this.user.name = 'User2';
}
}
ここに、
ユーザーモデルがインポートされます
ユーザーオブジェクトはコンポーネントのコンストラクターで作成されます
onButtonTapイベントが実装されています。onButtonTapを実装すると、Userオブジェクトが更新され、プロパティの名前がUser2として設定されます。
ステップ4
アプリケーションをコンパイルして実行し、ボタンをクリックしてモデルを変更すると、自動的に変更されます Label テキスト。
アプリケーションの初期状態と最終状態は次のとおりです。
初期状態
一方向のデータバインディングの初期状態を以下に示します-
最終状態
一方向のデータバインディングの最終状態を以下に示します-
双方向データバインディング
NativeScriptは、高度な機能のための双方向データバインディングも提供します。モデルデータをUIにバインドし、UIで更新されたデータをモデルにバインドします。
双方向のデータバインディングを行うには、ngModelプロパティを使用してから、以下のように[]と()で囲みます。
<TextField [(ngModel)] = 'this.user.name'></TextField>
双方向のデータバインディングをよりよく理解するために、BlankNgAppアプリケーションを変更してみましょう。
ステップ1
NativeScriptFormsModuleをHomeModuleにインポートします(src/app/home/home.module.ts)以下に指定されているように-
import { NgModule, NO_ERRORS_SCHEMA } from "@angular/core";
import { NativeScriptCommonModule } from "nativescript-angular/common";
import { HomeRoutingModule } from "./home-routing.module";
import { HomeComponent } from "./home.component";
import { NativeScriptFormsModule } from "nativescript-angular/forms";
@NgModule({
imports: [
NativeScriptCommonModule,
HomeRoutingModule,
NativeScriptFormsModule
],
declarations: [
HomeComponent
],
schemas: [
NO_ERRORS_SCHEMA
]
})
export class HomeModule { }
ここに、
NativeScriptFormsModuleは、双方向のデータバインディングを有効にします。そうしないと、双方向のデータバインディングが期待どおりに機能しません。
ステップ2
以下のようにホームコンポーネントのUIを変更します-
<ActionBar> <Label text="Home"></Label></ActionBar>
<GridLayout columns="*" rows="auto, auto">
<TextField hint="Username" row='0' column='0' color="gray"
backgroundColor="lightyellow" height="75px" [(ngModel)]='this.user.name'>
</TextField>
<Label [text]='this.user.name' row='1' column='0' height="50px"
textAlignment='center' style='font-size: 16px; font-weight: bold;
margin: 0px 32px 0 25px;'>
</Label>
</GridLayout>
ここに、
ラベルコンポーネントのテキストプロパティは、一方向のデータバインディングで設定されます。モデルユーザーが更新されると、そのテキストプロパティが自動的に更新されます。
TextFieldコンポーネントは、ngModelをthis.user.nameとして設定します。モデルユーザーが更新されると、そのテキストプロパティが自動的に更新されます。同時に、ユーザーがTextFieldの値を変更すると、モデルも更新されます。モデルが更新されると、Labelのテキストプロパティの変更もトリガーされます。したがって、ユーザーがデータを変更すると、そのデータはLabelのtextプロパティに表示されます。
ステップ3
アプリケーションを実行し、テキストボックスの値を変更してみてください。
アプリケーションの初期状態と最終状態は、以下に指定されているようになります-
初期状態
双方向データバインディング–初期状態を以下に示します-
最終状態
双方向データバインディング–最終状態を以下に示します-