NativeScript - привязка данных
Связывание данных - одна из передовых концепций, поддерживаемых NativeScript. NativeScript максимально точно следует концепции привязки данных Angular. Связывание данных позволяет компоненту пользовательского интерфейса отображать / обновлять текущее значение модели данных приложения без каких-либо усилий по программированию.
NativeScript поддерживает два типа привязки данных. Они следующие -
One-Way data binding - Обновлять пользовательский интерфейс при изменении модели.
Two-Way data binding- Синхронизировать пользовательский интерфейс и модель. Всякий раз, когда модель обновляется, пользовательский интерфейс обновляется автоматически, а также всякий раз, когда пользовательский интерфейс получает данные от пользователя (пользовательский интерфейс обновляется), модель будет обновляться.
Давайте изучим обе концепции в этом разделе.
Односторонняя привязка данных
NativeScript предоставляет простой вариант для включения односторонней привязки данных в компоненте пользовательского интерфейса. Чтобы включить одностороннюю привязку данных, просто добавьте квадратную скобку в свойство целевого пользовательского интерфейса, а затем назначьте ему необходимое свойство модели.
Например, чтобы обновить текстовое содержимое компонента Label, просто измените код пользовательского интерфейса, как показано ниже -
<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 также обеспечивает двустороннюю привязку данных для расширенной функциональности. Он связывает данные модели с пользовательским интерфейсом, а также связывает данные, обновленные в пользовательском интерфейсе, с моделью.
Чтобы выполнить двустороннюю привязку данных, используйте свойство 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
Измените пользовательский интерфейс домашнего компонента, как показано ниже -
<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>
Вот,
Свойство текста компонента Label устанавливается с односторонней привязкой данных. Если модель пользователя обновлена, ее текстовое свойство будет обновлено автоматически.
Компонент TextField устанавливает ngModel как this.user.name. Если модель пользователя обновлена, ее текстовое свойство обновится автоматически. В то же время, если пользователь изменяет значение TextField, модель также обновляется. Если модель будет обновлена, это также вызовет изменение свойства текста метки. Итак, если пользователь изменяет данные, это будет отображаться в текстовом свойстве ярлыка.
Шаг 3
Запустите приложение и попробуйте изменить значение текстового поля.
Начальное и конечное состояние приложения будет таким же, как указано ниже -
Начальное состояние
Двусторонняя привязка данных - начальное состояние приведено ниже -
Конечное состояние
Двусторонняя привязка данных - конечное состояние показано ниже -