好的,我结束了这一点。似乎是一个更好的方法:
import {Component, OnInit} from '@angular/core';
import {ActivatedRoute, Params} from '@angular/router';
import {Location} from '@angular/common';
import 'rxjs/add/operator/switchMap';
import {Observable} from 'rxjs/Rx';
import {DocumentService} from './document.service';
import {AlertService} from '../alert/alert.service';
@Component({
selector: 'document-edit',
templateUrl: './document-edit.component.html',
})
export class DocumentEditComponent implements OnInit {
public document: any;
public categories: any;
public categoriesArray: Array<{id: number, name: string}> = [];
constructor(
private documentService: DocumentService,
private alertService: AlertService,
private route: ActivatedRoute,
private location: Location
) {}
ngOnInit(): void {
this.route.params
.switchMap((params: Params) => this.documentService.getDocument(+params['id']))
.subscribe(document => this.document = document);
this.getCategories();
}
/*
* Push categories already assigned to this document
* to an array used in updateDocument method
* and check already assigned categories in the template.
*/
documentCategories(document: any, categories: any) {
for (let documentCategory of document.categories) {
this.categoriesArray.push({id: documentCategory.id, name: documentCategory.name});
}
for (let category of categories) {
for (let categoryDocument of category.documents) {
if (categoryDocument.id === document.id) {
category.checked = true;
}
}
}
}
onChange(id: number, name: string, isChecked: boolean) {
if (isChecked) {
if (this.categoriesArray.some(x => x.name === name)) {
return;
} else {
this.categoriesArray.push({id: id, name: name});
}
} else {
let index: number = this.categoriesArray.indexOf(this.categoriesArray.find(x => x.name === name));
this.categoriesArray.splice(index, 1);
}
return this.categoriesArray;
}
updateDocument(id: number, title: string, body: any) {
let document = {id: id, title: title, body: body, categories: this.categoriesArray};
this.documentService.updateDocument(document).subscribe(
data => {
this.alertService.success('Document updated.');
return true;
},
error => {
this.alertService.error("Error updating document! " + error);
return Observable.throw(error);
}
);
}
getCategories() {
this.documentService.getCategories().subscribe(
data => {this.categories = data},
err => console.error(err),
() => this.documentCategories(this.document, this.categories)
);
}
goBack(): void {
this.location.back();
}
}
模板:
<form>
<div class="row">
<div class="col-md-8">
<div class="form-group">
<label for="document-title">Title</label>
<input type="text"
class="form-control"
id="document-title"
name="document-title" [(ngModel)]="document.title">
</div>
<div class="form-group">
<label for="document-body">Body</label>
<simple-tiny
name="document-body"
elementId="document-body"
[(ngModel)]="document.body">
</simple-tiny>
</div>
</div>
<div class="col-md-4">
<label>Categories</label>
<div *ngFor="let category of categories">
<div class="checkbox">
<label>
<input type="checkbox"
[checked]=category.checked
(change)="onChange(category.id, category.name, $event.target.checked)"> {{category.name}}
</label>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<button type="submit"
class="btn btn-default"
(click)="updateDocument(document.id, document.title, document.body)">
Submit
</button>
</div>
</div>
</form>
“函数被调用每鼠标移动”?你可以制造摔跤手吗? – CharanRoot
是的,我正在研究它。 – Tompo
我可能需要时间(应用程序非常复杂),同时有我读过的线索:https://stackoverflow.com/questions/38583967/angular2-why-functions-are-called-each-time-i-移动鼠标 – Tompo