2017-05-09 23 views
1

私はオブジェクトの値をサーバーに何度も照会するのではなく、取得しようとしています。角度の観測可能なサブオブジェクトを取得しないでください

しかし、何が間違っているのか間違っていますか?

Iサービスで、次があります。

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$をINFOに

が定義されていないと言うので。ログイン時にreloagUserDataを呼び出す私は再びそれを呼び出すために探していない。私はちょうどユーザー変数を呼び出すためにlooing。

答えて

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); 
    } 
} 

コンポーネント1:

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'は** shared service **を使うのです。共有サービスは、コンポーネント間でデータを通信して渡すために使用されます。コミュニケーションを起こさせずに、同じコンポーネント内ですべてをやりたい場合は、メソッドを作成してデータを収集し、それを持っているだけです。完全なコンポーネントコードを投稿して、私があなたが達成しようとしていることを考えてください。 ;) – SrAxi

+0

私はu btwに与えた他のリンクをチェックしましたか?とにかく、私のアイデアは、サービス内のものが、他のコンポーネントが購読してそれをさらに使用するvvariableを更新するということです。 – maria

関連する問題