2017-02-10 36 views
1

在开发ionic2项目时,我创建了一个新的供应商,但在MyClass中设置变量时遇到一些困难。Ionic2:处理供应商

import { Injectable } from '@angular/core'; 
import { Http, Headers } from '@angular/http'; 
import 'rxjs/add/operator/map'; 

@Injectable() 
export class MyClass { 
    token_acces: any; 
    token_room: any; 

    constructor(private http: Http) { 
     this.token_acces = null; 
     this.token_room = null; 
    } 

    login(id,pwd){ 
     let headers = new Headers(); 
     headers.append('Content-Type', 'application/json'); 
     this.http.post('/localhost/', 
         JSON.stringify({ 
          username: id , 
          password: pwd 
         }), {headers : headers}) 
        .map(res => res.json()) 
        .subscribe(data=>{ 
         this.token_acces = data; 
        }); 
    } 

    getToken(){ 
     return this.token_acces; 
    } 

} 

的主要问题是,login()不设置token_access这是null当我打电话的getToken()

此外,我有一个疑问,这个供应商被我的应用程序中的所有页面使用。 例如网页包含:

... 
export class HomePage { 
    id: any; 
    pwd: any; 

    constructor(public navCtrl: NavController, public myClassService: MyClass) { } 

    login(): void{ 
     this.myClassService.login(this.id, this.pwd); 
     this.navCtrl.push(SearchPage, { token : this.myClassService.getToken()}); 
    } 
} 

如果我做同样的另一个页面,例如:

export class SearchPage { 
    token: any; 

    constructor(public navCtrl: NavController, public myClassService: MyClass) { } 
... 

我使用同一个实例或它的MyClass不同istance等我无法获取上一页中设置的值?

+0

如果提供程序在'ngModule'中声明,则您将拥有相同的实例。至于没有收到令牌,http调用是异步的,它可能还没有设置值。 –

+0

在按钮按下时,我在提供程序中执行http.post,在新页面加载后,它从提供程序获取值,但它仍未设置。我如何等待http.post完成他的处理? – pittuzzo

+0

在提供程序中的http post上创建一个Observable。将该Observable返回到调用类/方法。在调用类中订阅此Observable。现在,在调用类中,在'subscribe()'中做任何你需要做的事情。看看http://stackoverflow.com/questions/42160061/ionic-2-login-component-and-auth-service –

回答

2

在你的代码中MyClass的:

login(id,pwd){ 
    let headers = new Headers(); 
    headers.append('Content-Type', 'application/json'); 
    return Observable.create(observer => { 
     this.http.post('/localhost/', JSON.stringify({ 
         username: id , 
         password: pwd 
        }), {headers : headers}) 
     .map(res => res.json()) 
     .subscribe(data => { 
      this.token_acces = data; 
      observer.next(data); 
     },(err) => { 
      console.log("Error occurred: ", err); 
      observer.error(err); 
     }); 
    }); 
} 

在HomePage类或其他代码调用的类/方法:

login(): void{ 
    this.myClassService.login(this.id, this.pwd).subscribe((data) => { 
     this.navCtrl.push(SearchPage, { token : this.myClassService.getToken()}); 
    }, 
    (err) => { 
     console.log("Error occurred : ", err); 
    }); 
} 

你甚至都不需要使用getToken()。您可以在subscribe()中使用data,这将为您提供有关令牌的必要数据。

+0

非常感谢,它确实工作。是否有可能设置超时? – pittuzzo

+0

是的。一般来说,你可以在任何地方设置超时时间,例如'setTimeout(()=> console.log(“3秒后完成”); },3000);'。你如何使用它取决于你。 –