Angular Angualr2-NGR中的ngModel表示不工作。模型已正确更新,但视图中存在一些错误
我正在做一个使用Angular2创建旅行计划的小任务。工作流程如下:用户将输入起始点和目的地,以及中间停止点的数量。一旦用户提交“Go”按钮,就会出现Planner表,用户可以在其中输入中间停止点以及添加/删除停止点。不知何故,我没有得到屏幕截图所示的理想输出 在添加新的停止点,这是我得到的。。。 期望输出。。。。 这就是Tripdetails对象的外观。查看对象和视图之间的差异。 代码如下: Trip.tsAngular Angualr2-NGR中的ngModel表示不工作。模型已正确更新,但视图中存在一些错误,angular,angular2-ngmodel,Angular,Angular2 Ngmodel,我正在做一个使用Angular2创建旅行计划的小任务。工作流程如下:用户将输入起始点和目的地,以及中间停止点的数量。一旦用户提交“Go”按钮,就会出现Planner表,用户可以在其中输入中间停止点以及添加/删除停止点。不知何故,我没有得到屏幕截图所示的理想输出 在添加新的停止点,这是我得到的。。。 期望输出。。。。 这就是Tripdetails对象的外观。查看对象和视图之间的差异。 代码如下: Trip.ts export class Trip { startPoint:stri
export class Trip {
startPoint:string;
destination:string;
stops:number;
}
export class TripDetail {
startPoint:string;
destination:string;
}
import { Component } from '@angular/core';
import { Trip } from './Trip';
import { TripDetail } from './TripDetails';
@Component({
selector: 'my-app',
moduleId: module.id,
templateUrl: 'app.component.html'
})
export class AppComponent {
trip: Trip = {
startPoint : "",
destination : "",
stops : 0
};
tripDetails: TripDetail[];
clicked(startPoint:string, destination:string, stops:string):void {
let length = parseInt(stops);
this.trip.startPoint = startPoint;
this.trip.destination = destination;
this.trip.stops = length;
this.tripDetails = [];
for (let i=0 ; i< length; i++) {
let tripDetail :TripDetail={
startPoint: "",
destination: ""
}
if( i==0) {
tripDetail.startPoint = this.trip.startPoint;
}
if( i== length-1) {
tripDetail.destination = this.trip.destination;
}
this.tripDetails.push(tripDetail);
}
}
syncData(index:number, locationType:string) {
if(locationType == 'destinationLocation') {
this.tripDetails[index + 1].startPoint = this.tripDetails[index].destination;
}
else if (locationType == 'sourceLocation') {
this.tripDetails[index - 1].destination = this.tripDetails[index].startPoint;
}
}
addStop(index:number):void {
let stop:TripDetail={
startPoint:"newStop",
destination:"newStop"
}
this.tripDetails.splice(index,0,stop);
}
removeStop(index:number):void{
let destination = this.tripDetails[index].destination,
arrlength = this.tripDetails.length;
if(index==0){
return;
}
else if( index== arrlength-1) {
this.tripDetails[index-1].destination = this.tripDetails[index].destination;
this.tripDetails.splice(index,1);
}
else{
this.tripDetails.splice(index,1);
this.tripDetails[index].destination= destination;
}
}
}
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
@NgModule({
imports: [ BrowserModule , FormsModule],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
TripDetails.ts
export class Trip {
startPoint:string;
destination:string;
stops:number;
}
export class TripDetail {
startPoint:string;
destination:string;
}
import { Component } from '@angular/core';
import { Trip } from './Trip';
import { TripDetail } from './TripDetails';
@Component({
selector: 'my-app',
moduleId: module.id,
templateUrl: 'app.component.html'
})
export class AppComponent {
trip: Trip = {
startPoint : "",
destination : "",
stops : 0
};
tripDetails: TripDetail[];
clicked(startPoint:string, destination:string, stops:string):void {
let length = parseInt(stops);
this.trip.startPoint = startPoint;
this.trip.destination = destination;
this.trip.stops = length;
this.tripDetails = [];
for (let i=0 ; i< length; i++) {
let tripDetail :TripDetail={
startPoint: "",
destination: ""
}
if( i==0) {
tripDetail.startPoint = this.trip.startPoint;
}
if( i== length-1) {
tripDetail.destination = this.trip.destination;
}
this.tripDetails.push(tripDetail);
}
}
syncData(index:number, locationType:string) {
if(locationType == 'destinationLocation') {
this.tripDetails[index + 1].startPoint = this.tripDetails[index].destination;
}
else if (locationType == 'sourceLocation') {
this.tripDetails[index - 1].destination = this.tripDetails[index].startPoint;
}
}
addStop(index:number):void {
let stop:TripDetail={
startPoint:"newStop",
destination:"newStop"
}
this.tripDetails.splice(index,0,stop);
}
removeStop(index:number):void{
let destination = this.tripDetails[index].destination,
arrlength = this.tripDetails.length;
if(index==0){
return;
}
else if( index== arrlength-1) {
this.tripDetails[index-1].destination = this.tripDetails[index].destination;
this.tripDetails.splice(index,1);
}
else{
this.tripDetails.splice(index,1);
this.tripDetails[index].destination= destination;
}
}
}
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
@NgModule({
imports: [ BrowserModule , FormsModule],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
应用程序组件.ts
export class Trip {
startPoint:string;
destination:string;
stops:number;
}
export class TripDetail {
startPoint:string;
destination:string;
}
import { Component } from '@angular/core';
import { Trip } from './Trip';
import { TripDetail } from './TripDetails';
@Component({
selector: 'my-app',
moduleId: module.id,
templateUrl: 'app.component.html'
})
export class AppComponent {
trip: Trip = {
startPoint : "",
destination : "",
stops : 0
};
tripDetails: TripDetail[];
clicked(startPoint:string, destination:string, stops:string):void {
let length = parseInt(stops);
this.trip.startPoint = startPoint;
this.trip.destination = destination;
this.trip.stops = length;
this.tripDetails = [];
for (let i=0 ; i< length; i++) {
let tripDetail :TripDetail={
startPoint: "",
destination: ""
}
if( i==0) {
tripDetail.startPoint = this.trip.startPoint;
}
if( i== length-1) {
tripDetail.destination = this.trip.destination;
}
this.tripDetails.push(tripDetail);
}
}
syncData(index:number, locationType:string) {
if(locationType == 'destinationLocation') {
this.tripDetails[index + 1].startPoint = this.tripDetails[index].destination;
}
else if (locationType == 'sourceLocation') {
this.tripDetails[index - 1].destination = this.tripDetails[index].startPoint;
}
}
addStop(index:number):void {
let stop:TripDetail={
startPoint:"newStop",
destination:"newStop"
}
this.tripDetails.splice(index,0,stop);
}
removeStop(index:number):void{
let destination = this.tripDetails[index].destination,
arrlength = this.tripDetails.length;
if(index==0){
return;
}
else if( index== arrlength-1) {
this.tripDetails[index-1].destination = this.tripDetails[index].destination;
this.tripDetails.splice(index,1);
}
else{
this.tripDetails.splice(index,1);
this.tripDetails[index].destination= destination;
}
}
}
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
@NgModule({
imports: [ BrowserModule , FormsModule],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
您使用
trackBy
跟踪索引是完全正确的,您只是遇到了一些问题<当没有唯一的ngModel
索引进行跟踪(带有属性的变量,例如[(ngModel)]=“myItem.myProperty”
)时,需要code>trackby,因此在处理基元数组时需要,例如在以下示例中需要trackby
:
<div *ngFor="let item of items">
<input [(ngModel)]="item" />
</div>
以及组件中相应的功能:
trackByFn(index: number, stops: string) {
return index;
}
这里有一个
它正在工作,但正如您使用的
trackBy:index
expression。。它不允许元素更新。。尝试删除trackBy:index
,它应该可以工作。我尝试了此操作,但问题仍然存在。当我签入console时,这些值是正确的,但在视图部分中,有些问题。向addStop函数添加一个console.log行,看看它是否被调用两次?它被调用一次。我已经检查过了,有什么问题吗?我在图像上看不到。