NativeScript - การผูกข้อมูล
การผูกข้อมูลเป็นหนึ่งในแนวคิดขั้นสูงที่สนับสนุนโดย NativeScript NativeScript เป็นไปตามแนวคิดการผูกข้อมูลเชิงมุมอย่างใกล้ชิดที่สุด การผูกข้อมูลทำให้คอมโพเนนต์ UI แสดง / อัปเดตค่าปัจจุบันของโมเดลข้อมูลแอปพลิเคชันโดยไม่ต้องใช้ความพยายามในการเขียนโปรแกรมใด ๆ
NativeScript รองรับการผูกข้อมูลสองประเภท มีดังนี้ -
One-Way data binding - อัปเดต UI ทุกครั้งที่มีการเปลี่ยนแปลงโมเดล
Two-Way data binding- ซิงค์ UI และรุ่น เมื่อใดก็ตามที่อัปเดตโมเดล UI จะอัปเดตโดยอัตโนมัติและเมื่อใดก็ตามที่ UI ได้รับข้อมูลจากผู้ใช้ (UI ได้รับการอัปเดต) โมเดลจะได้รับการอัปเดต
ให้เราเรียนรู้ทั้งสองแนวคิดในส่วนนี้
การผูกข้อมูลทางเดียว
NativeScript มีตัวเลือกง่ายๆในการเปิดใช้งานการเชื่อมข้อมูลทางเดียวในคอมโพเนนต์ UI ในการเปิดใช้งานการเชื่อมข้อมูลทางเดียวเพียงเพิ่มวงเล็บเหลี่ยมในคุณสมบัติของ UI เป้าหมายจากนั้นกำหนดคุณสมบัติของโมเดลที่จำเป็น
ตัวอย่างเช่นหากต้องการอัปเดตเนื้อหาข้อความของส่วนประกอบฉลากเพียงแค่เปลี่ยนรหัส 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 มีการเปลี่ยนแปลงเช่นกัน ดังนั้นหากผู้ใช้เปลี่ยนแปลงข้อมูลข้อมูลจะแสดงในคุณสมบัติข้อความของป้ายกำกับ
ขั้นตอนที่ 3
เรียกใช้แอปพลิเคชันและลองเปลี่ยนค่าของกล่องข้อความ
สถานะเริ่มต้นและขั้นสุดท้ายของแอปพลิเคชันจะคล้ายกันตามที่ระบุด้านล่าง -
สถานะเริ่มต้น
การผูกข้อมูลสองทาง - สถานะเริ่มต้นได้รับด้านล่าง -
สถานะสุดท้าย
การผูกข้อมูลสองทาง - สถานะสุดท้ายแสดงอยู่ด้านล่าง -