为什么 ionic 3 双向数据绑定不起作用?
Why is ionic 3 two way data binding not working?
我正在尝试充实我正在进行的离子项目的注册页面
尝试将我的 ([ngModel]) 绑定到组件中的对象 属性。
让我只显示代码摘录,以便您理解
**Registration.ts** // This is my registration component
import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
@IonicPage()
@Component({
selector: 'page-registration',
templateUrl: 'registration.html',
})
export class RegistrationPage {
newStaffInfo = {
username: "",
password: "",
rePassword: "",
email: "",
sex: ""
}
newStaffTemplateObject: Object = [
{
label: "Username",
field: this.newStaffInfo.username,
},
{
label: "Password",
field: this.newStaffInfo.password
},
{
label: "Re-enter Your password",
field: this.newStaffInfo.rePassword
},
{
label: "Email",
field: this.newStaffInfo.email
},
{
label: "Sex",
field: this.newStaffInfo.sex
},
];
constructor(public navCtrl: NavController, public navParams: NavParams) {
}
ionViewDidLoad() {
console.log('ionViewDidLoad RegistrationPage');
}
validateForm(){
console.log("Validate in this functin...");
}
}
这是我的HTML模板
<ion-content padding>
<form (ngSubmit)="validateForm()" #form="ngForm">
<ion-list>
<ion-item *ngFor="let item of newStaffTemplateObject">
<ion-label floating> {{item.label}} </ion-label>
<ion-input type="text" [(ngModel)]="item.field" name="item.label" #item.label="ngModel" required> </ion-input>
</ion-item>
<ion-item>
<button ion-button outline block full> Register </button>
</ion-item>
</ion-list>
</form>
<!-- For DEbugging puprpose only -->
{{newStaffInfo.username}} //This is suppose to reflect changes immediately
</ion-content>
即使使用上述设置,它也根本不起作用。
我可以在这里做什么来使两个数据绑定工作
在您的代码中,您使用 newStaffInfo
:
的属性初始化 newStaffTemplateObject
项
newStaffTemplateObject = [
{
label: "Username",
field: this.newStaffInfo.username
},
{
label: "Password",
field: this.newStaffInfo.password
},
...
];
然后将 newStaffTemplateObject
项绑定到模板中的输入元素。
数据绑定有效:它更新 newStaffTemplateObject
项的值。但是,它不会更新 newStaffInfo
中的相关属性(根据您的调试标记,这是您所期望的)。原因:newStaffTemplateObject[0].field
没有成为对newStaffInfo.username
的引用;它是一个单独的变量,在初始化后不维护任何 link。
一个可能的解决方案是将每个 field
值设置为 newStaffInfo
中 属性 的名称:
newStaffTemplateObject = [
{
label: "Username",
field: "username",
},
{
label: "Password",
field: "password"
},
{
label: "Re-enter password",
field: "rePassword"
},
{
label: "Email",
field: "email"
},
{
label: "Sex",
field: "sex"
},
];
并使用 bracket notation:
将 newStaffInfo
的属性绑定到您的输入元素
<ion-item *ngFor="let item of newStaffTemplateObject">
...
<ion-input type="text" [(ngModel)]="newStaffInfo[item.field]" ... > </ion-input>
</ion-item>
您可以测试this stackblitz中的代码。
由于我无法对 Connorsfan 的回答添加评论,因此它显示为单独的回答。
Connorsfan 的回答对我最初的问题很有帮助,为我指明了 Stackblitz 的方向,谢谢!
我也 运行 遇到了一个有趣的问题,尝试导航多级 json 并使用真正的动态表单。
建立在 ConnorsFan 的 stackblitz 之上,以添加具有多级支持的动态数据绑定,因为现成的香蕉 [(ngModel)] 在使用表达式处理多级时不起作用 json.可在此处找到 link:https://stackblitz.com/edit/angular-ymvaml
希望这能帮助其他面临同样问题但具有多层次问题的人json。
我正在尝试充实我正在进行的离子项目的注册页面 尝试将我的 ([ngModel]) 绑定到组件中的对象 属性。
让我只显示代码摘录,以便您理解
**Registration.ts** // This is my registration component
import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
@IonicPage()
@Component({
selector: 'page-registration',
templateUrl: 'registration.html',
})
export class RegistrationPage {
newStaffInfo = {
username: "",
password: "",
rePassword: "",
email: "",
sex: ""
}
newStaffTemplateObject: Object = [
{
label: "Username",
field: this.newStaffInfo.username,
},
{
label: "Password",
field: this.newStaffInfo.password
},
{
label: "Re-enter Your password",
field: this.newStaffInfo.rePassword
},
{
label: "Email",
field: this.newStaffInfo.email
},
{
label: "Sex",
field: this.newStaffInfo.sex
},
];
constructor(public navCtrl: NavController, public navParams: NavParams) {
}
ionViewDidLoad() {
console.log('ionViewDidLoad RegistrationPage');
}
validateForm(){
console.log("Validate in this functin...");
}
}
这是我的HTML模板
<ion-content padding>
<form (ngSubmit)="validateForm()" #form="ngForm">
<ion-list>
<ion-item *ngFor="let item of newStaffTemplateObject">
<ion-label floating> {{item.label}} </ion-label>
<ion-input type="text" [(ngModel)]="item.field" name="item.label" #item.label="ngModel" required> </ion-input>
</ion-item>
<ion-item>
<button ion-button outline block full> Register </button>
</ion-item>
</ion-list>
</form>
<!-- For DEbugging puprpose only -->
{{newStaffInfo.username}} //This is suppose to reflect changes immediately
</ion-content>
即使使用上述设置,它也根本不起作用。 我可以在这里做什么来使两个数据绑定工作
在您的代码中,您使用 newStaffInfo
:
newStaffTemplateObject
项
newStaffTemplateObject = [
{
label: "Username",
field: this.newStaffInfo.username
},
{
label: "Password",
field: this.newStaffInfo.password
},
...
];
然后将 newStaffTemplateObject
项绑定到模板中的输入元素。
数据绑定有效:它更新 newStaffTemplateObject
项的值。但是,它不会更新 newStaffInfo
中的相关属性(根据您的调试标记,这是您所期望的)。原因:newStaffTemplateObject[0].field
没有成为对newStaffInfo.username
的引用;它是一个单独的变量,在初始化后不维护任何 link。
一个可能的解决方案是将每个 field
值设置为 newStaffInfo
中 属性 的名称:
newStaffTemplateObject = [
{
label: "Username",
field: "username",
},
{
label: "Password",
field: "password"
},
{
label: "Re-enter password",
field: "rePassword"
},
{
label: "Email",
field: "email"
},
{
label: "Sex",
field: "sex"
},
];
并使用 bracket notation:
将newStaffInfo
的属性绑定到您的输入元素
<ion-item *ngFor="let item of newStaffTemplateObject">
...
<ion-input type="text" [(ngModel)]="newStaffInfo[item.field]" ... > </ion-input>
</ion-item>
您可以测试this stackblitz中的代码。
由于我无法对 Connorsfan 的回答添加评论,因此它显示为单独的回答。
Connorsfan 的回答对我最初的问题很有帮助,为我指明了 Stackblitz 的方向,谢谢!
我也 运行 遇到了一个有趣的问题,尝试导航多级 json 并使用真正的动态表单。
建立在 ConnorsFan 的 stackblitz 之上,以添加具有多级支持的动态数据绑定,因为现成的香蕉 [(ngModel)] 在使用表达式处理多级时不起作用 json.可在此处找到 link:https://stackblitz.com/edit/angular-ymvaml
希望这能帮助其他面临同样问题但具有多层次问题的人json。