2016-03-29 4 views
1

http postの後にデータ配列を更新する正しい方法を知っています。angularjs2:http-postの後の配列の更新

私は何を持っていることは、これらの方法でトランザクション・サービスである:

getUserTransactions(user_id) { 
    return this.http.get('http://localhost:3000/users/' + user_id + '/transactions', { headers: contentHeaders }) 
     .map(res => res.json()); 
    } 

createTransaction(balance, amount, user_id, paymethod_id, redirect) { 
    let body = JSON.stringify({ balance, amount, user_id, paymethod_id }); 
    this.http.post('http://localhost:3000/transactions', body, { headers: contentHeaders }) 
     .subscribe(
     response => { 
     this.router.parent.navigateByUrl(redirect); 
     }, 
     error => { 
     alert(error.text()); 
     console.log(error.text()); 
     } 
    ); 

とコンポーネント

export class HomeComponent { 

    public transactions: Transaction[]; 

    constructor(
    private router: Router, 
    private loginService: LoginService, 
    private trnService: TransactionService 
    ) { 
    if (!loginService.isLoggedIn()) 
     this.router.parent.navigateByUrl('/logout'); 

    var userid = this.loginService.getUserId(); 
    this.trnService.getUserTransactions(userid).subscribe(transactions => this.transactions = transactions); 

    return; 
    } 

    makeTransaction(){ 
    var userid = this.loginService.getUserId(); 
    this.trnService.createTransaction(10, 2, userid, 1, "/home"); 
    } 

} 

HTML:だから、最初

<tbody> 
    <tr *ngFor="#transaction of transactions; #index=index"> 
--- 

、「/ホームに移動して「ユーザートランザクションの配列をロードしています。

ボタンをクリックすると、makeTransaction()メソッドが呼び出されます。これはサービスTransactionService -> createTransactionによってhttp投稿要求を実行します。私はトランザクションが正常に終了した後に "/ home"にリダイレクトすると思ったが、これはうまくいきませんでした。(私はコンストラクタが再度呼び出されないと仮定します)何とかサービスからpublic transactions: Transaction[];を更新できますか?多分リファレンスを作っていますか?

+0

「これはうまくいかない」という意味はどういう意味ですか? –

+0

私はブラウザでページを完全にリロードする場合に限り、配列はリロードされません。コンストラクタが再び呼び出されないと仮定します。 – user1908375

+0

あなたはそれらが作成されていると確信していますか? – uksz

答えて

1

すべてのトランザクションのリストで新しいトランザクションを表示したい場合。新しいトランザクションが完了したときに通知するために、リストとオブザーバブルの両方を含む共有サービスを活用してください。

コンポーネント内のtransactionsリストは、「トランザクションの作成」呼び出しにリンクされていません。ここで

は、サンプルの実装です:

export class HomeComponent { 
    public transactions: Transaction[]; 

    constructor(
    private router: Router, 
    private loginService: LoginService, 
    private trnService: TransactionService 
) { 
    if (!loginService.isLoggedIn()) 
     this.router.parent.navigateByUrl('/logout'); 

    var userid = this.loginService.getUserId(); 
    this.trnService.getUserTransactions(userid).subscribe(transactions => { 
     this.transactions = transactions; 
    }); 

    this.trnService.onTransactionCreated(transaction => { 
     this.transactions.push(transaction); 
    }); 

    return; 
    } 

    makeTransaction(){ 
    var userid = this.loginService.getUserId(); 
    this.trnService.createTransaction(10, 2, userid, 1, "/home"); 
    } 
} 

全体に対するサービスの単一のインスタンスを共有するには:あなたはコンポーネント内で通知され、トランザクションのリストを更新することができます

export class TransactionService { 
    private transactionObservable:Observable<any>; 
    private transactionObserver:Observer<any>; 

    constructor() { 
    this.transactionObservable((observer:Observer) => { 
     this.transactionObserver = observer; 
    }).share(); 
    } 

    notifyTransactionCreated(transaction:any) { 
    this.transactionObserver.next(transaction); 
    } 

    onTransactionCreated(callback:(transaction:any) => void) { 
    this.transactionObservable.subscribe(callback); 
    } 

    (...) 

createTransaction(balance, amount, user_id, paymethod_id, redirect) { 
    let body = JSON.stringify({ balance, amount, user_id, paymethod_id }); 
    this.http.post('http://localhost:3000/transactions', body, { headers: contentHeaders }) 
    .subscribe(
     response => { 
     this.notifyTransactionCreated(response.json()); // <------ 
     this.router.parent.navigateByUrl(redirect); 
     }, 
     error => { 
     alert(error.text()); 
     console.log(error.text()); 
     } 
    ); 
    } 
} 

この方法アプリケーションのブートストラップ時にサービスを指定するのを忘れないでください:

bootstrap(AppComponent, [ 
    HTTP_PROVIDERS, 
    TransactionService 
]); 
+0

ありがとうございます。一般的な質問:私の他のアイデアは、モデルへの参照をサービスに渡してメソッドを呼び出したそのモデル(トランザクションリストを再び更新する)で、コンポーネント/オブジェクトへの参照を何らかの形でサービスに渡すことは可能ですか? – user1908375

+0

はい、そういうことができます。つまり、観察可能ベースのアプローチは一般的に改善されています。これは、変更内容にコンポーネントに反応することができるからです。この質問を参照してください:http://stackoverflow.com/questions/34376854/delegation-eventemitter-or-observable-in-angular2/35568924 –

関連する問題