select ngmodel 没有绑定变量
select ngmodel not binding the variable
我有一个非常简单的页面,其中有两个选择填写了相同的数据(银行账户)。一个旨在成为源,另一个目标是为了创建交易。在这个简单的场景中,交易只是从一个账户转移到另一个账户的金额。
我在将交易发送到我的休息服务时遇到问题。从下面的图片很容易看出交易变量没有正确填写,但我不知道出了什么问题。
我看到交易中的第一个帐户(源)部分填充,第二个(目标)具有 [object Object]。为什么没有填充相同的对象,因为它们是完全相同类型的对象,为什么第一个名称没有填充?
新-transaction.html:
<div>
<div>
<label>Source Account</label>
<select [(ngModel)]="transaction.sourceAccount">
<option *ngFor="let a of accounts" [value]="a" >{{a.name}}</option>
</select>
</div>
<div>
<label>Target Account</label>
<select [(ngModel)]="transaction.targetAccount" >
<option *ngFor="let a of accounts" [value]="a">{{a.name}}</option>
</select>
</div>
<div>
<input type="text" [(ngModel)]="transaction.amount">
</div>
<div>
<button (click)="addTransaction()">Add</button>
</div>
</div>
新-transaction.component.ts
...
export class NewTransactionComponent implements OnInit {
accounts: Account[];
transaction: Transaction = new Transaction();
constructor(private accountService: AccountService, private transactionService: TransactionService) { }
ngOnInit(): void {
this.transaction.targetAccount = new Account();
this.transaction.sourceAccount = new Account();
this.accountService
.getAllAccounts()
.subscribe(
(accounts) => {
this.accounts = accounts;
}
);
}
addTransaction(): void {
this.transactionService.addTransaction(this.transaction)
.subscribe(
(transaction) => {
this.transaction = transaction;
}
);
//this.router.navigate(['/home']);
}
}
transaction.service.ts
...
public addTransaction(transaction: Transaction): Observable<Transaction> {
return this.http
.post(API_URL + '/transaction', transaction)
.map(response => {
return new Transaction(response.json());
})
.catch(this.handleError);
}
transaction.ts
import { Account } from "./account";
export class Transaction {
idtransaction: number;
amount: number;
sourceAccount: Account;
targetAccount: Account;
constructor(values: Object = {}) {
Object.assign(this, values);
}
}
account.ts
import { User } from "./user";
export class Account {
id: number;
name: string = '';
user: User[] = [];
constructor(values: Object = {}) {
Object.assign(this, values);
}
}
*** 已编辑
我认为您在这里没有使用 ngValue
指令来获取对象
反映在绑定到 ngModel
.
的值中
<label>Target Account</label>
<select [(ngModel)]="transaction.targetAccount" >
<option *ngFor="let a of accounts" [ngValue]="a">{{a.name}}</option>
</select>
来自文档.. 如果您的选项值恰好是对象(并且您希望将表单中的选择保存为对象),请改用 ngValue。
请在此处查看 select element.
的完整文档
请注意,我不确定为什么它似乎在 sourceAccount
属性 上运行。
我用下面的代码得到了这个。我喜欢 Garth posted,而且它的代码也更少。我在看到他的回答几分钟后就准备好了,所以我打算 post 因为我花了一些时间在上面。
new-transaction.component.html
<div>
<div>
<label>Source Account</label>
<select [(ngModel)]="sourceBankAccount" name="sourceBankAccount" (change)="sourceAccountChanged($event.target.value)" >
<option *ngFor="let a of accounts" [value]="a.id" >{{a.name}}</option>
</select>
</div>
<div>
<label>Target Account</label>
<select [(ngModel)]="targetBankAccount" name="targetBankAccount" (change)="targetAccountChanged($event.target.value)" >
<option *ngFor="let a of accounts" [value]="a.id">{{a.name}}</option>
</select>
</div>
<div>
<input type="text" [(ngModel)]="transaction.amount">
</div>
<div>
<button (click)="addTransaction()">Add</button>
</div>
</div>
请注意,这使用帐户 ID 作为下拉列表中的值。这里也有 change
个事件调用。
new-transaction.component.ts
export class NewTransactionComponent implements OnInit {
accounts: BankAccount[];
transaction: Transaction = new Transaction();
sourceBankAccount: number;
targetBankAccount: number;
constructor(private accountService: BankAccountService, private transactionService: TransactionService) { }
ngOnInit(): void {
this.accountService
.getAllAccounts()
.subscribe(
(accounts) => {
this.accounts = accounts;
}
);
}
sourceAccountChanged(account: number) {
const newAccount: BankAccount = this.accounts.find(acct => acct.id === +account);
if (newAccount) {
this.transaction.sourceAccount = new BankAccount(newAccount);
}
}
targetAccountChanged(account: number) {
const newAccount: BankAccount = this.accounts.find(acct => acct.id === +account);
if (newAccount) {
this.transaction.targetAccount = new BankAccount(newAccount);
}
}
addTransaction(): void {
console.log(this.transaction);
this.transactionService.addTransaction(this.transaction)
.subscribe(
(transaction) => {
this.transaction = transaction;
}
);
}
}
我有一个非常简单的页面,其中有两个选择填写了相同的数据(银行账户)。一个旨在成为源,另一个目标是为了创建交易。在这个简单的场景中,交易只是从一个账户转移到另一个账户的金额。
我在将交易发送到我的休息服务时遇到问题。从下面的图片很容易看出交易变量没有正确填写,但我不知道出了什么问题。
我看到交易中的第一个帐户(源)部分填充,第二个(目标)具有 [object Object]。为什么没有填充相同的对象,因为它们是完全相同类型的对象,为什么第一个名称没有填充?
新-transaction.html:
<div>
<div>
<label>Source Account</label>
<select [(ngModel)]="transaction.sourceAccount">
<option *ngFor="let a of accounts" [value]="a" >{{a.name}}</option>
</select>
</div>
<div>
<label>Target Account</label>
<select [(ngModel)]="transaction.targetAccount" >
<option *ngFor="let a of accounts" [value]="a">{{a.name}}</option>
</select>
</div>
<div>
<input type="text" [(ngModel)]="transaction.amount">
</div>
<div>
<button (click)="addTransaction()">Add</button>
</div>
</div>
新-transaction.component.ts
...
export class NewTransactionComponent implements OnInit {
accounts: Account[];
transaction: Transaction = new Transaction();
constructor(private accountService: AccountService, private transactionService: TransactionService) { }
ngOnInit(): void {
this.transaction.targetAccount = new Account();
this.transaction.sourceAccount = new Account();
this.accountService
.getAllAccounts()
.subscribe(
(accounts) => {
this.accounts = accounts;
}
);
}
addTransaction(): void {
this.transactionService.addTransaction(this.transaction)
.subscribe(
(transaction) => {
this.transaction = transaction;
}
);
//this.router.navigate(['/home']);
}
}
transaction.service.ts
...
public addTransaction(transaction: Transaction): Observable<Transaction> {
return this.http
.post(API_URL + '/transaction', transaction)
.map(response => {
return new Transaction(response.json());
})
.catch(this.handleError);
}
transaction.ts
import { Account } from "./account";
export class Transaction {
idtransaction: number;
amount: number;
sourceAccount: Account;
targetAccount: Account;
constructor(values: Object = {}) {
Object.assign(this, values);
}
}
account.ts
import { User } from "./user";
export class Account {
id: number;
name: string = '';
user: User[] = [];
constructor(values: Object = {}) {
Object.assign(this, values);
}
}
*** 已编辑
我认为您在这里没有使用 ngValue
指令来获取对象
反映在绑定到 ngModel
.
<label>Target Account</label>
<select [(ngModel)]="transaction.targetAccount" >
<option *ngFor="let a of accounts" [ngValue]="a">{{a.name}}</option>
</select>
来自文档.. 如果您的选项值恰好是对象(并且您希望将表单中的选择保存为对象),请改用 ngValue。
请在此处查看 select element.
的完整文档请注意,我不确定为什么它似乎在 sourceAccount
属性 上运行。
我用下面的代码得到了这个。我喜欢 Garth posted,而且它的代码也更少。我在看到他的回答几分钟后就准备好了,所以我打算 post 因为我花了一些时间在上面。
new-transaction.component.html
<div>
<div>
<label>Source Account</label>
<select [(ngModel)]="sourceBankAccount" name="sourceBankAccount" (change)="sourceAccountChanged($event.target.value)" >
<option *ngFor="let a of accounts" [value]="a.id" >{{a.name}}</option>
</select>
</div>
<div>
<label>Target Account</label>
<select [(ngModel)]="targetBankAccount" name="targetBankAccount" (change)="targetAccountChanged($event.target.value)" >
<option *ngFor="let a of accounts" [value]="a.id">{{a.name}}</option>
</select>
</div>
<div>
<input type="text" [(ngModel)]="transaction.amount">
</div>
<div>
<button (click)="addTransaction()">Add</button>
</div>
</div>
请注意,这使用帐户 ID 作为下拉列表中的值。这里也有 change
个事件调用。
new-transaction.component.ts
export class NewTransactionComponent implements OnInit {
accounts: BankAccount[];
transaction: Transaction = new Transaction();
sourceBankAccount: number;
targetBankAccount: number;
constructor(private accountService: BankAccountService, private transactionService: TransactionService) { }
ngOnInit(): void {
this.accountService
.getAllAccounts()
.subscribe(
(accounts) => {
this.accounts = accounts;
}
);
}
sourceAccountChanged(account: number) {
const newAccount: BankAccount = this.accounts.find(acct => acct.id === +account);
if (newAccount) {
this.transaction.sourceAccount = new BankAccount(newAccount);
}
}
targetAccountChanged(account: number) {
const newAccount: BankAccount = this.accounts.find(acct => acct.id === +account);
if (newAccount) {
this.transaction.targetAccount = new BankAccount(newAccount);
}
}
addTransaction(): void {
console.log(this.transaction);
this.transactionService.addTransaction(this.transaction)
.subscribe(
(transaction) => {
this.transaction = transaction;
}
);
}
}