[英]Update/PUT json with Angular 2
I have problem with update/PUT with angular 2. I create function updateMember() in member-detail.component.ts file. 我有更新/ PUT与角度2的问题。我在member-detail.component.ts文件中创建函数updateMember()。 Function get object correct and send it to server, but when tslint code, cosole return some errors: 函数获取对象并将其发送到服务器,但是当tslint代码时,cosole返回一些错误:
app/members/member-detail.component.ts(51,42): error TS2345: Argument of type 'Member[]' is not assignable to parameter of type 'Member'. Property '_id' is missing in type 'Member[]'.
app/members/member-detail.component.ts(53,17): error TS7006: Parameter 'res' implicitly has an 'any' type.
app/members/member-detail.component.ts(56,17): error TS7006: Parameter 'error' implicitly has an 'any' type.
member.model member.model
export class Member {
constructor(
public _id: string,
public name: string,
public old: number
) { }
}
members.service members.service
import { Injectable } from '@angular/core';
import { Http, Response, Headers, RequestOptions } from '@angular/http';
import { Member } from './member';
import { Observable } from 'rxjs/Rx';
// Import RxJs required methods
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
@Injectable()
export class MembersService {
private apiUrl = 'http://localhost:3000/api/members';
constructor( private http: Http ) { }
...
updateMember(member: Member): Observable<Member[]> {
let body = JSON.stringify( member );
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });
return this.http.put(`${this.apiUrl}/${member._id}`, body, options)
.map(this.extractData)
.catch(this.handleError);
}
private extractData(res: Response) {
let body = res.json();
return body.data || {};
}
private handleError (error: Response | any) {
// In a real world app, we might use a remote logging infrastructure
let errMsg: string;
if (error instanceof Response) {
const body = error.json() || '';
const err = body.error || JSON.stringify(body);
errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
} else {
errMsg = error.message ? error.message : error.toString();
}
console.error(errMsg);
return Observable.throw(errMsg);
}
}
member-detail.component 成员detail.component
import { Component, OnInit, Input, trigger, state, style, transition, animate, keyframes } from '@angular/core';
import { ActivatedRoute, Params } from '@angular/router';
import { Observable } from 'rxjs/Observable';
import { Member } from './member';
import { MembersService } from './members.service';
@Component({
moduleId: module.id,
selector: 'member-detail',
templateUrl: 'member-detail.component.html',
styleUrls: [ 'member-detail.component.css' ],
animations: [
trigger('showContent', [
transition('void => *', [
animate(500, keyframes([
style({opacity: 0, offset: 0}),
style({opacity: 0.01, offset: 0.99}),
style({opacity: 1, offset: 1}),
]))
])
])
]
})
export class MemberDetailComponent implements OnInit {
member: Member[];
errorMessage: string;
constructor( private route: ActivatedRoute, private membersService: MembersService ) { }
...
// function update but not tslint correct
updateMember() {
this.membersService.updateMember(this.member)
.subscribe(
res => {
this.member = res;
},
error => this.errorMessage = <any>error
);
}
}
Inside your MemberDetailComponent
, you have a field named member
which is of type Member[]
which means array
of Member
's 在你的MemberDetailComponent
,你有一个名为member
的字段,其类型为Member[]
,表示Member
的array
export class MemberDetailComponent implements OnInit {
member: Member[]; <---
and you are giving this as an input to the updateMember
method 并且您将此作为updateMember
方法的输入
this.membersService.updateMember(this.member) <---
but it expects an input of type Member
. 但它希望输入类型为Member
。
updateMember(member: Member): Observable<Member[]> { <---
I find solution but It's not very well, so if somebody have better suggestion share it! 我找到解决方案,但它不是很好,所以如果有人有更好的建议分享它!
I added new variable newMember: any;
我添加了新变量newMember: any;
inside MemberDetailComponent()
and refer object from this.member
to newMember
and use it in updateMember()
在MemberDetailComponent()
,将newMember
对象this.member
到newMember
并在updateMember()
使用它
Below my new code: 在我的新代码下面:
member-detail.component.ts 成员detail.component.ts
import { Component, OnInit, trigger, state, style, transition, animate, keyframes } from '@angular/core'; import { ActivatedRoute, Params } from '@angular/router'; import { Observable } from 'rxjs/Observable'; import { Member } from './member'; import { MembersService } from './members.service'; @Component({ moduleId: module.id, selector: 'member-detail', templateUrl: 'member-detail.component.html', styleUrls: [ 'member-detail.component.css' ], animations: [ trigger('showContent', [ transition('void => *', [ animate(500, keyframes([ style({opacity: 0, offset: 0}), style({opacity: 0.01, offset: 0.99}), style({opacity: 1, offset: 1}), ])) ]) ]) ] }) export class MemberDetailComponent implements OnInit { member: Member[]; errorMessage: string; newMember: any; // new variable constructor( private route: ActivatedRoute, private membersService: MembersService ) { } ngOnInit() { this.getMember(); } getMember(): void { this.route.params.subscribe(params => { if (params['id'] !== undefined) { this.membersService.getMember(params['id']) .subscribe( member => { this.member = member }, error => this.errorMessage = <any>error, () => this.newMember = this.member ); } }); } updateMember(): void { this.membersService.updateMember(this.newMember) .subscribe( res => this.newMember = res, error => this.errorMessage = <any>error, () => this.getMember() ); } }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.