Angular2 Modal Form - 显示数据,但我无法进行编辑

时间:2016-09-30 01:48:12

标签: forms angular typescript modal-dialog

早上好,

我是Angular的新手并乐于学习。

我已经成功将表单加载到我的模态中,并在#34; viewDetails"点击。

但是,当我从<form ngNoForm ><form #editCashMovementForm="ngForm">对表单稍作更改时,数据将不再加载。

我试图制作一个可编辑的弹出式表单,在提交时更新,但这只是我失败的最后一步。

有人有建议吗?

谢谢

GWS

Component.HTML

&#13;
&#13;
<div>
    <table class="table table-hover">
        <thead>
            <tr>
                <th><i class="fa fa-text-width fa-2x" aria-hidden="true"></i>Cash Movement ID</th>
                <th><i class="fa fa-user fa-2x" aria-hidden="true"></i>PortfolioCode</th>
                <th><i class="fa fa-paragraph fa-2x" aria-hidden="true"></i>CCY Out</th>
                <th><i class="fa fa-map-marker fa-2x" aria-hidden="true"></i>Account Out</th>
                <th><i class="fa fa-calendar-o fa-2x" aria-hidden="true"></i>Date</th>
                <th></th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            <tr *ngFor="let cashmovement of cashmovements">
                <td> {{cashmovement.cashMovementId}}</td>
                <td>{{cashmovement.portfolioCode}}</td>
                <td>{{cashmovement.ccyo}}</td>
                <td>{{cashmovement.accountO}}</td>
                <td>{{cashmovement.date | dateFormat | date:'medium'}}</td>                         
            <td><button class="btn btn-danger" (click)="removeCashMovement(cashmovement)"><i class="fa fa-trash" aria-hidden="true"></i>Delete</button></td>
             <td><button class="btn btn-primary" (click)="viewCashMovementDetails(cashmovement.cashMovementId)"><i class="fa fa-info-circle" aria-hidden="true"></i>Edit</button></td>
            </tr>
        </tbody>
    </table> 
</div>

<div bsModal #childModal="bs-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
    <div class="modal-dialog modal-lg" *ngIf="selectedCashMovementLoaded">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" aria-label="Close" (click)="hideChildModal()"><span aria-hidden="true">&times;</span></button>
                <h4>{{cashmovementDetails.cashMovementId}} Details</h4>
            </div>
            <div class="modal-body">                 
                <form ngNoForm >
                <!--<form #editCashMovementForm="ngForm" (ngSubmit)="updateCashMovement(editCashMovementForm)">-->
                    <div class="form-group">
                        <div class="row">
                            <div class="col-md-4">
                                <label class="control-label"><i class="fa fa-user" aria-hidden="true"></i>Portfolio Code</label>
                                <input type="text" class="form-control" [(ngModel)]="cashmovementDetails.portfolioCode" />
                            </div>
 
                            <div class="col-md-4">
                                <label class="control-label"><i class="fa fa-text-width" aria-hidden="true"></i>Currency Out</label>
                                <input type="text" class="form-control" [(ngModel)]="cashmovementDetails.ccyo" />
                            </div>
 
                            <div class="col-md-4">
                                <label class="control-label"><i class="fa fa-paragraph" aria-hidden="true"></i>Account Out</label>
                                <input type="text" class="form-control" [(ngModel)]="cashmovementDetails.accountO" />
                            </div>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="row">
                            <div class="col-xs-6">
                                <label class="control-label"><i class="fa fa-calendar-o" aria-hidden="true"></i>Date</label>
                                <input type="text" class="form-control" [(ngModel)]="cashmovementDetails.date" />
                            </div>
                        </div>
                    </div> 
                    <hr/>
                    <button type="button" [disabled]="!editCashMovementForm.form.valid" class="btn btn-default" (click)="updateCashMovement(editCashMovementForm)"><i class="fa fa-pencil-square-o" aria-hidden="true"></i>Update</button>
                </form>
            </div>
        </div>
    </div>
</div>
&#13;
&#13;
&#13;

Component.ts

&#13;
&#13;
import { Component, OnInit, ViewChild, Input, Output, trigger, state, style, animate, transition } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { NgForm } from '@angular/forms';
 
import { ModalDirective } from 'ng2-bootstrap';
 
import { CashMovementDataService } from './cashmovement.data.service';
import { DateFormatPipe } from '../shared/pipes/date-format.pipe';
import { ItemsService } from '../shared/utils/items.service';
import { NotificationService } from '../shared/utils/notification.service';
import { ConfigService } from '../shared/utils/config.service';
import { MappingService } from '../shared/utils/mapping.service';
import { ICashMovement, Pagination, PaginatedResult } from '../shared/interfaces';
 
 
@Component({
    moduleId: module.id,
    selector: 'cashmovements',
    templateUrl: './cashmovement-list.component.html'    
})

 export class CashMovementListComponent implements OnInit { 
    @ViewChild('childModal') public childModal: ModalDirective;
    cashmovements: ICashMovement[];
    
      // Modal properties
    @ViewChild('modal')   
    modal: any;
    items: string[] = ['item1', 'item2', 'item3'];
    selected: string;
    output: string;    
    selectedCashMovementId: number;
    cashmovementDetails: ICashMovement;
    selectedCashMovementLoaded: boolean = false;    
    index: number = 0;
    backdropOptions = [true, false, 'static'];
    animation: boolean = true;
    keyboard: boolean = true;
    backdrop: string | boolean = true;

    constructor(private route: ActivatedRoute,
        private router: Router,
        private dataService: CashMovementDataService,
        private itemsService: ItemsService,
        private notificationService: NotificationService,
        private configService: ConfigService,
        private mappingService: MappingService) { }
 
 
    ngOnInit() {
        this.loadCashMovements();
    } 

    loadCashMovements(){
            this.dataService.getCashMovements()       
            .subscribe((cashmovements: ICashMovement[]) => {
                this.cashmovements = cashmovements;                
            },
            error => {
                this.notificationService.printErrorMessage('Failed to load cashmovements. ' + error);
            });

        } 

        removeCashMovement(cashmovement: ICashMovement) {
        this.notificationService.openConfirmationDialog('Are you sure you want to delete this cashmovement?',
            () => {                
                this.dataService.deleteCashMovement(cashmovement.cashMovementId)
                    .subscribe(() => {
                        this.itemsService.removeItemFromArray<ICashMovement>(this.cashmovements, cashmovement);
                        this.notificationService.printSuccessMessage(cashmovement.cashMovementId + ' has been deleted.');                        
                    },
                    error => {                        
                        this.notificationService.printErrorMessage('Failed to delete ' + cashmovement.cashMovementId + ' ' + error);
                    });
            });
    }

    viewCashMovementDetails(id: number) {
        this.selectedCashMovementId = id;
        this.dataService.getCashMovement(this.selectedCashMovementId)
            .subscribe((cashmovement: ICashMovement) => {
                this.cashmovementDetails = this.itemsService.getSerialized<ICashMovement>(cashmovement);                
                this.cashmovementDetails.date = new DateFormatPipe().transform(cashmovement.date, ['local']);
                this.selectedCashMovementLoaded = true;
                this.childModal.show();                
            },
            error => {                
                this.notificationService.printErrorMessage('Failed to load cashmovement. ' + error);
            });
    }

        updateCashMovement(editCashMovementForm: NgForm) { 
        var scheduleMapped = this.mappingService.mapCashMovementDetailsToCashMovement(this.cashmovementDetails);
        this.dataService.updateCashMovement(scheduleMapped)
            .subscribe(() => {
                this.notificationService.printSuccessMessage('Cash Movement has been updated');                
            },
            error => {
                this.notificationService.printErrorMessage('Failed to update cash movement. ' + error);
            });
    }

 
    public hideChildModal(): void {
        this.childModal.hide();
    }
     
}
&#13;
&#13;
&#13;

data.service.ts

&#13;
&#13;
    import { Injectable } from '@angular/core';
    import { Http, Response, Headers } from '@angular/http';
    import { Observable } from 'rxjs/Observable';
    import {Observer} from 'rxjs/Observer';
    import 'rxjs/add/operator/map';
    import 'rxjs/add/operator/catch';

    import { ICashMovement, ICashMovementDetails, Pagination, PaginatedResult } from '../shared/interfaces';
    import { ItemsService } from '../shared/utils/items.service';
    import { ConfigService } from '../shared/utils/config.service';

    @Injectable()
    export class CashMovementDataService {

        _baseUrl: string = '';

        constructor(private http: Http,
            private itemsService: ItemsService,            
            private configService: ConfigService) {
            this._baseUrl = configService.getApiURI();
        }


        getCashMovements(): Observable<void> {
            return this.http.get(this._baseUrl + 'cashmovements')
                .map((res: Response) => { return res.json();     })
                .catch(this.handleError);
        }

        deleteCashMovement(id: number): Observable<void> {
        return this.http.delete(this._baseUrl + 'cashmovements/?id=' + id)
            .map((res: Response) => {
                return;
            })
            .catch(this.handleError);
    }

    getCashMovement(id: number): Observable<ICashMovement> {
        return this.http.get(this._baseUrl + 'cashmovements/?id=' + id)
            .map((res: Response) => {
                return res.json();
            })
            .catch(this.handleError);
    }

        updateCashMovement(cashmovement: ICashMovement): Observable<void> {
 
        let headers = new Headers();
        headers.append('Content-Type', 'application/json');
 
        return this.http.put(this._baseUrl + 'cashmovements/?id=' + cashmovement.cashMovementId, JSON.stringify(cashmovement), {
            headers: headers
        })
            .map((res: Response) => {
                return;
            })
            .catch(this.handleError);
    }
    

        private handleError(error: any) {
            var applicationError = error.headers.get('Application-Error');
            var serverError = error.json();
            var modelStateErrors: string = '';

            if (!serverError.type) {
                console.log(serverError);
                for (var key in serverError) {
                    if (serverError[key])
                        modelStateErrors += serverError[key] + '\n';
                }
            }

            modelStateErrors = modelStateErrors = '' ? null : modelStateErrors;

            return Observable.throw(applicationError || modelStateErrors || 'Server error');
        }

    }
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

我需要从

更改表单输入
<input type="text" class="form-control" [(ngModel)]="cashmovementDetails.portfolioCode" />

<input type="text" class="form-control" [(ngModel)]="cashmovementDetails.portfolioCode" name="portfolioCode" #portfolioCode="ngModel"/>