2016-01-16 2 views
1

У меня есть некоторые проблемы. В моей регистрации я хочу просмотреть сообщение об ошибке, если пользователь уже существует в базе данных. Поэтому я создал переменную serverAnswer, которая будет обрабатывать ответ об ошибке с сервера.Angular2 - обновление переменной после функции (обещание?)

Моего register.service.ts содержания

@Injectable() 
export class RegisterService { 
    constructor(private http: Http) {} 

    public serverAnswer: Object; 

    getAnswer() { 
    return this.serverAnswer; 
    } 

    addUser(user: User) { 
    var headers = new Headers(); 
    headers.append('Content-type', 'application/json'); 

    this.http.post('/users/register', JSON.stringify(user), {headers: headers}) 
    .subscribe(
     response => { 
     if(response.json().success) { 
      window.location.href = "/"; 
     } 
     if(response.json().error) { 
      this.serverAnswer = response.json(); 
     } 
     } 
    ) 
    } 
} 

Как вы можете видеть, в начале в "serverAnswer" переменная пуста. Ошибка «response.json().» Обрабатывает текст ошибки. Хорошо, теперь пришло время показать мой контент register.component.ts.

export class RegisterComponent { 
    constructor(private http: Http, private registerService: RegisterService) {} 

    serverAnswer: Object; 

    onSubmit(userName: string, userPassword: string, userEmail: string) { 
    this.registerService.addUser(new User(userName, userPassword, userEmail)) 
    this.serverAnswer = this.registerService.getAnswer(); 
    } 
} 

Проблема заключается в том, что «systemAnswer» из RegisterService был обновлен до выполнения функции AddUser была сделана. В результате, если этот пользователь уже существует в базе данных, то в первый раз «systemAnswer» пуст и во второй раз обрабатывает текст response.json().

Это место:

this.registerService.addUser(new User(userName, userPassword, userEmail)) 
this.serverAnswer = this.registerService.getAnswer(); 

Что я должен сделать, чтобы обновить переменную serverAnswer только тогда, когда функция AddUser делается?

Благодарим за помощь!

ответ

0

Это будет лучше, если вы вернетесь Observable объект из службы:

@Injectable() 
export class RegisterService { 
    constructor(private http: Http) {} 

    addUser(user: User) { 
    var headers = new Headers(); 
    headers.append('Content-type', 'application/json'); 

    return this.http.post('/users/register', JSON.stringify(user), {headers: headers}) 
     .map(response => response.json()); 
    } 
} 

, а затем использовать его в контроллере:

export class RegisterComponent { 
    constructor(private http: Http, private registerService: RegisterService) {} 

    serverAnswer: Object; 

    onSubmit(userName: string, userPassword: string, userEmail: string) { 
     this.registerService.addUser(new User(userName, userPassword, userEmail)) 
      .subscribe(
       response => { 
        if (response.success) { 
         window.location.href = "/"; 
        } else if (response.error) { 
         this.serverAnswer = response; 
        } 
       } 
      ); 
    } 
} 
+0

Эй, спасибо за ваш ответ. У меня проблема 'Property 'subscribe' не существует в типе 'void''. Думаю, мне нужно импортировать некоторый модуль rxjs? – elzoy

+0

вам нужно подписаться на контроллер. Думаю, я обновил ответ. – dfsq

+0

Теперь подписка работает, но 'TypeError: this.http.post (...). Map не является функцией' – elzoy

Смежные вопросы