2017-04-06 60 views
0

我有一个关于在Angular2如何观测工作的问题..我目前使用以下.subscribe在角2通过服务从发布到服务器的组件数据

@angular/cli: 1.0.0 
node: 6.10.0 
os: win32 x64 

我有一个ADDUSER分量使用用户服务的方法将数据发布到服务器。我能够实现这一点,但是对组件文件将数据发送到服务方法时发生的情况有疑问。 我已经导入了所需的软件包。下面是一个发送形式的数据服务的方法

addUser.component.ts

export class AddUser{ 

    addUserForm:FormGroup; 
    value:any; 
    constructor(private userService: UserService,private formBuilder: FormBuilder) { 

     this.addUserForm = this.formBuilder.group({ 
      name:['',Validators.required], 
      age:['',Validators.required], 
      email:['',Validators.required] 
     }); 

    } 

    submit(value){ 

     this.userService.addUser(value).subscribe(data => { 
     // refresh the list 
     console.log(data) 
     return true; 
     }, 
     error => { 
     console.log(error); 
     }); 

    } 

} 

方法下面是在该服务用于将请求发送到服务器

user.service方法。 TS

import {Injectable} from '@angular/core'; 
import { Http, Response, Headers, RequestOptions } from '@angular/http'; 

import 'rxjs/add/operator/cache'; 
import 'rxjs/add/operator/map'; 
import {Observable} from 'rxjs'; 

@Injectable() 
export class UserService{ 

    _userInfoData: Observable<any>; 
    private addUserUrl = 'http://localhost:8080/addUser'; 

    constructor(private http: Http){ } 

    addUser(body: Object): Observable<any>{ 
    console.log(body) 
    let bodyString = JSON.stringify(body) 
    let headers  = new Headers({ 'Content-Type': 'application/json' }); // ... Set content type to JSON 
    let options  = new RequestOptions({ headers: headers }); // Create a request option 

    return this.http.post('http://localhost:8080/addUser', body, options) // ...using post request 
      .map((res:Response) => res.json()) // ...and calling .json() on the response to return data 
      .catch((error:any) => Observable.throw(error.json().error || 'Server error')); //...errors if any 

    } 

} 

我的问题是,当我在addUser.component.ts删除.subscribe from the submit method请求调用服务方法addUser(body: Object): Observable<any>但服务方法不会发布到服务器。

addUser.component.ts

submit(value){ 

     this.userService.addUser(value) 

    } 

任何人都可以请帮我理解这背后

更新观念:

@Denko:你是正确的他并没有叫这两个功能但只有错误

submit(value){ 

     this.userService.addUser(value).subscribe(data => { 
     // refresh the list 
     console.log(data) 
     return true; 
     }, 
     error => { 
     console.log(error); 
     }); 

    } 

这是什么让我吨他错误TypeError:error.json is not a function

更新2

@Denko ...感谢帮助我在这里...下面是与类的组件文件。

addUser.component.ts

export class AddUser{ 
@HostBinding('@routeAnimation') routeAnimation = true; 
    @HostBinding('style.display') display = 'block'; 
    addUserForm:FormGroup; 
    value:any; 
    constructor(private userService: UserService,private formBuilder: FormBuilder) { 

     this.addUserForm = this.formBuilder.group({ 
      name:['',Validators.required], 
      age:['',Validators.required], 
      email:['',Validators.required] 
     }); 

    } 

    submit(value){ 

     this.userService.addUser(value).subscribe(data => { 
     // refresh the list 
     console.log(data) 
     return true; 
     }, 
     error => { 
     console.log(error); 
     }); 

    } 

} 

下面是一个用来创建Ajax请求到服务器

user.service.ts

import {Injectable} from '@angular/core'; 
import { Http, Response, Headers, RequestOptions } from '@angular/http'; 

import 'rxjs/add/operator/cache'; 
import 'rxjs/add/operator/map'; 
import {Observable} from 'rxjs'; 

@Injectable() 
export class UserService{ 

    _userInfoData: Observable<any>; 
    private addUserUrl = 'http://localhost:8080/addUser'; 

    constructor(private http: Http){ } 

    addUser(body: Object): Observable<any>{ 
    console.log(body) 
    let bodyString = JSON.stringify(body) 
    let headers  = new Headers({ 'Content-Type': 'application/json' }); // ... Set content type to JSON 
    let options  = new RequestOptions({ headers: headers }); // Create a request option 

    return this.http.post('http://localhost:8080/addUser', body, options) // ...using post request 
      .map((res:Response) => res.json()) // ...and calling .json() on the response to return data 
      .catch((error:any) => Observable.throw(error.json().error || 'Server error')); //...errors if any 

    } 

} 

每当服务文件我命中服务方法的请求正确传递到服务器,我能够创建一个用户,但它总是进入错误块,并引发下面的错误....

TypeError:error.json is not a function 

我想指出的是,在服务方法catch块不叫,直到服务器不可用,但在这个类里面的error块总是被调用,即使请求经过服务器.....我在这里丢失或做错了什么

+0

如果可观察到的没有任何用户,也不会提出请求 – echonax

+0

谢谢你的答案 – Apoorv

回答

2

所以,尽可能短:想象一下,Observable是一个只有在有人在倾听时才会谈话的人。对于某人“观察”观察者,其他人需要拨打.subscribe()。如果没有订户(没有听众),Observable将不会做任何事情。

在你的情况下,该addUser函数返回一个Observable,其他人可以订阅。所以,你的提交功能应该是这样的

this.userService.addUser(value).subscribe(data => { console.log("use data here"); }, err => { console.log("check if any err"); })

+0

感谢您的回答...这是有道理的.. 。我还有一个问题..当我使用你提出的方法,如果我尝试在控制台上打印错误,我得到下面的错误...即使请求成功.... err => { console.log(err);} TypeError:err.json不是函数 – Apoorv

+0

你可以发布代码吗?它没有办法调用这两个函数。第一个是成功,第二个是错误..有第三个,你可以添加它被执行无论如何..其中一个被称为“终于” –

+0

已在我的问题发表评论 – Apoorv