# 中繼器1 ###### tags: `CTBC-Lab4` ```typescript // 函式 // {studentId:number,studentName:string,studentScore:number,gradeId:number,gradeName:string,gradeHowMany:number} onUpdateStudent(updateForm: any) { console.log("updateForm內容如下 \n", updateForm); const URLGetOne = 'http://localhost:8080/api/student/' + updateForm.studentId; console.log(URLGetOne); this.http.get<Student>(URLGetOne).subscribe( (data) => { console.log("查看gradeId : ", updateForm.gradeId); // 學生 data.studentId = updateForm.studentId; data.studentName = updateForm.studentName; data.studentScore = updateForm.studentScore; // 年級 data.gradeBean.gradeId = updateForm.gradeId; data.gradeBean.gradeName = updateForm.gradeName; data.gradeBean.gradeHowMany = updateForm.gradeHowMany; const URLPost = 'http://localhost:8080/api/student'; this.http.post(URLPost, data).subscribe( (data2) => { this.onGetAllStudent(); console.log('修改成功, 結果是:', data2); }); }, (error) => { console.error('GetAll failed'); console.error(error); }); } ``` --- ```java // 取出舊的一筆 StudentBean ori = studentBeanRepository.findById(oneStudent.getStudentId()).get(); // 把creatAt設定上去 oneStudent.setCreateDate(ori.getCreateDate()); // 儲存回資料庫 StudentBean savedStudent = studentBeanRepository.save(oneStudent); ``` --- * 加入Font Awesome 圖案css連結 * icon網址 * https://fontawesome.com/v5/search * index.html ``` <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/all.css"> ``` --- student.component.ts `npm i @ng-bootstrap/ng-bootstrap --legacy-peer-deps` ```typescript // 學生修改程式---------------------------------------------------------------------------- // 變數 subscriptionCode: any; openModalCode(cdocCode?:any) { const refCode = this.modal.open(FormStudentCodeComponent, // 將cdoc導入至form.component.ts { size: 'lg' }); refCode.componentInstance.cdocCode = cdocCode; // 需加入此行,跳出來的Modal才能帶出原始資料 console.log("studentCode : ", cdocCode.studentCode); this.subscriptionCode = refCode.componentInstance.result.subscribe( // 此處result不可改名 (result:any) => { console.log("修改後的程式碼 : ", result); const URLGetOne = 'http://localhost:8080/api/student/' + cdocCode.studentId; console.log("欲修改的網址 : ",URLGetOne); this.http.get<Student>(URLGetOne).subscribe( (data) => { // 學生 data.studentId = cdocCode.studentId; data.studentCode = result.studentCode; const URLPost = 'http://localhost:8080/api/student'; this.http.post(URLPost, data).subscribe( (data2) => { this.onGetAllStudent(); console.log('修改成功, 結果是:', data2); }); }, (error) => { console.error('GetAll failed'); console.error(error); }); } ) } editStudentCode (cdocCode:any) { this.openModalCode(cdocCode); } ``` * form.component.html ```html <!--設定彈出的視窗有哪些欄位--> <div class="modal-header"> <!--表頭--> <h4 class="modal-title">修改一位學生</h4> </div> <!-- body --> <div class="modal-body"> <form #cform="ngForm"> <!--幫表單取名字,此處為cform--> <!--1個form-group,1個欄位--> <div class="form-group"> <div class="row"> <label for="studentName" class="col-2 col-form-label">學生名稱<span class="text-danger">*</span></label> <input type="text" class="col-10 form-control" [(ngModel)]="oneStudentForm.studentName" name="studentName" #studentName="ngModel" placeholder="學生名稱" required> <!--required為html語法,代表必填欄位--> </div> <div *ngIf="studentName.dirty"> <!-- if 的判斷 --> <!-- 有打過字 → dirty --> <span *ngIf="studentName.errors; then errors"></span> <!--then errorC的errors可以自填--> </div> </div> <!--1個form-group,1個欄位--> <div class="form-group"> <div class="row"> <label for="studentScore" class="col-2 col-form-label">學生分數<span class="text-danger">*</span></label> <input type="number" class="col-10 form-control" [(ngModel)]="oneStudentForm.studentScore" name="studentScore" #studentScore="ngModel" placeholder="學生分數" required min="0" max="100"> <!--required為html語法,代表必填欄位--> </div> <div *ngIf="studentScore.dirty"> <!-- if 的判斷 --> <!-- 有打過字 → dirty --> <span *ngIf="studentScore.errors; then errors"></span> <!--then errorC的errors可以自填--> </div> </div> <!-- 下拉式選單 --> <div class="form-group"> <div class="row"> <label for="gradeId">年級ID</label> <!-- 可以寫2個[(ngModel)]?? --> <select [(ngModel)]="selectedOption" (ngModelChange)="onSelectedOptionChange()" class="form-control" name="gradeId" id="gradeId" #gradeId="ngModel" [(ngModel)]="oneStudentForm.gradeBean.gradeId" name="gradeId"> <option *ngFor="let grade of gradeArray" [value]="grade.gradeId"> {{ grade.gradeId }} </option> </select> </div> </div> <div class="form-group"> <div> <label for="gradeName">年級名稱</label> <input type="text" class="col-10 form-control" [(ngModel)]="oneStudentForm.gradeBean.gradeName" name="gradeName" #gradeName="ngModel" placeholder="年級名稱" [value]="selectedGrade.gradeName" required> </div> </div> <div class="form-group"> <div> <label for="gradeHowMany">年級人數</label> <!-- <input type="number" name="gradeHowMany" id="gradeHowMany" name="gradeHowMany" ngModel #gradeHowMany="ngModel" class="col-10 form-control" [value]="selectedGrade.gradeHowMany" [(ngModel)]="oneStudentForm.gradeBean.gradeHowMany" /> --> <input type="number" class="col-10 form-control" [(ngModel)]="oneStudentForm.gradeBean.gradeHowMany" name="gradeHowMany" #gradeHowMany="ngModel" placeholder="年級人數" [value]="selectedGrade.gradeHowMany" required> </div> </div> <!-- footer區域 --> <div class="modal-footer"> <!--儲存按鈕--> <button type="submit" class="btn btn-outline-primary" (click)="save()" [disabled]="!cform.form.valid">儲存</button> <!-- !cform.form.valid → 有任何不符合的,都讓按鈕處於[disabled] (無法按下) --> <!-- cform.form → 表單屬性--> </div> </form> </div> <!--欄位的錯誤控制--> <ng-template #errors> <!--當出現#errors,都顯示欄位未填!--> <p class="text-danger">欄位未填!</p> </ng-template> <ng-template #phone_errors> <p class="text-danger">手機號碼需10碼!</p> </ng-template> <ng-template #toobig_errors> <p class="text-danger">超出規定學分數!</p> </ng-template> ``` ```html export class FormComponent implements OnInit { // 應為student型態。此Input來自student.component.ts // 於ngOnInit(): void {} 內使用 @Input() cdoc?:any; // result為變數名稱。 @Output() result: EventEmitter<any> = new EventEmitter<any>(); // 將資料傳出去 constructor( private http: HttpClient, public activeModal:NgbActiveModal, ) { } ngOnInit(): void { this.select(); // 讀出原始資料 if (this.cdoc) { this.oneStudentForm = { studentName:this.cdoc.studentName, studentScore:this.cdoc.studentScore, gradeBean:this.cdoc.gradeBean, } } } // Modal-------------------------------------------------------------------------- contactSave() { this.activeModal.close("Y"); } save() { // oneStudentForm為雙向連結,改html就會改ts,此處設定為關閉表單(即修改完成)後,傳送 this.result.emit(this.oneStudentForm); // 發出通知,讓subscrib收到 // 把資料丟出去,並未存進資料庫 this.activeModal.close('儲存'); // 關閉視窗,回傳訊息'儲存' // this.activeModal.dismiss() } } ```