2017-05-09 61 views
1

我想獲取一個對象的值,而不是查詢服務器這麼多次。角度可觀的子和獲得對象不會工作

但是我錯過什麼或做錯了什麼?

我在服務如下:

user$: Observable<any>; 

    private userChangeSet = new Subject<any>(); 


    constructor(private http: Http, private router: Router) { 
    this.user$ = this.userChangeSet.asObservable(); 
    } 

reloadUserData() { 
    let url = this.baseapi + '/getuser'; 
    return this.http.get(url) 
     .map(t=> { 
      this.updateUser(t.json().user); 
      return t.json(); 
     }); 
    } 
updateUser(object) { 
    this.userChangeSet.next(object); 
    } 

有沒有一種方法,我可以這樣調用它在另一個組件?

if (this.customservice.user.cash < 3000) { 

    } else { 

    } 

時t.json()。用戶的結果是

{username: username, cash: 1}

另外,爲什麼不這樣做?

this.customservice.user$.subscribe((value) => { 
     this.xxx= value; 
    }); 

因爲這裏說user$沒有定義

要的信息。即時通訊登錄時調用reloagUserData。即時通訊不想再次調用它。即時通訊只是調用用戶變量。

回答

0

我要指出的第一件事就是你沒有聲明Subject

user$: Observable<any>; 

private userChangeSet = new Subject<any>(); // You were missing this! :D 

    constructor(private http: Http, private router: Router) { 
    this.user$ = this.userChangeSet.asObservable(); 
    } 

是有辦法,我可以這樣調用它在另一個組件?

你接近:

private userData = this.reloadUserData(); // This returns {username: username, cash: 1} right? 

if (this.userData.cash < 3000) { 
    // Do stuff 
} else { 
    // Do other stuff 
} 

更新1:,如果你想將數據傳遞到正在偵聽您使用的共享服務創建的方法的組件

this.reloadUserData().subscribe((data) => { 
    this.userData = data; // Here we retrieve the data of the user and store in in our variable userData 
    this.sharedService.updateUser(this.userData); // Here we call the method of the shared service passing our user's data 
    } 
); 

什麼我們做的是:

  1. 我們呼籲,讓我們用戶的數據的方法
  2. 當我們接收到的數據,我們調用共享服務的方法和傳遞數據作爲參數
  3. 當我們調用方法,我們觸發Observable這意味着訂閱該方法的所有組件都將觸發並接收作爲參數發送的數據。因此,如果我們撥打updateUser(data),這將觸發訂閱user$的所有組件,並且它們將接收數據。

更新2:

快速例子。

共享服務:

@Injectable() 
export class CustomService { 
    user$: Observable<any>; 

    private userChangeSet = new Subject<any>();  

    constructor(private http: Http, private router: Router) { 
    this.user$ = this.userChangeSet.asObservable(); 
    } 

reloadUserData() { 
    let url = this.baseapi + '/getuser'; 
    return this.http.get(url) 
     .map(t=> { 
      this.updateUser(t.json().user); 
      return t.json(); 
     }); 
    } 

    updateUser(object) { 
    this.userChangeSet.next(object); 
    } 
} 

的Component1:

this.reloadUserData().subscribe((data) => { 
    this.userData = data; // Receives the data 
    this.sharedService.updateUser(this.userData); // Sends the data to the shared service 
    } 
); 

COMPONENT2:

this.customservice.user$.subscribe((data) => { 
     this.userData = data; // Is subscribed and listening, as soon as someone calls the method updateUser() from the shared service will get the data passed as parameter and will updated the value of userData 
}); 
+0

我忘了在話題,我已經把它添加。現在更新它。它仍然不會以某種方式工作。 是否有可能直接從變量本身獲取?所以我不必調用reloaduserdata?即時消息稱它在別的地方。 – maria

+0

問題是,如果您使用'Observable'並且'Subject'用於使用**共享服務**。共享服務用於在組件之間傳遞和傳遞數據。如果您不希望發生這種交流,並且想要在同一個組件中完成所有工作,只需創建方法,收集數據並獲得。發佈完整的組件代碼,以便我可以瞭解您要實現的目標。 ;) – SrAxi

+0

你檢查了我給你的其他鏈接嗎? 無論如何,我的想法是,服務中的東西會更新其他組件所訂購的vvariable並進一步使用它。 – maria