2016-11-03 25 views
1

salary.serviceplayer.componentがあります。給与変数がサービスで更新されると、プレーヤーコンポーネントのビューは更新されますか?それともAngular 2のケースではないのですか?アングル2サービス双方向データバインディング

ページが最初に読み込まれると、player.componentビューに50000が表示されるので、2人は一緒に作業しています。私が困惑している価値を更新しています。私は問題を解決する方法を確認したい人のため

salary.service

export class SalaryService { 

    public salary = 50000; // starting value which gets subtracted from 

    constructor() { } 

    public setSalary = (value) => { this.salary = this.salary - value }; 

} 

player.component

export class PlayerComponent { 

    constructor(private salaryService:SalaryService) {} 

    public salary = this.salaryService.salary; 

    public updateSalary = (value) => { this.salaryService.setSalary(value) }; 

} 

EDITは、ここPlunkerです:

http://plnkr.co/edit/aFRXHD3IAy0iFqHe5ard?p=preview

+0

これは角度とはあまり関係ありません。それは単にJavaScriptです。オブジェクト内のフィールドを更新しても、別のオブジェクト内の同じ名前のフィールドは自動的には更新されません。また、クラスメソッドの構文を学び、より良い名前を選択することをお勧めします。例えば、setSalaryメソッドはsalatyを設定しません。これは、給与から所定の値を減算します。 –

+0

私は違いを欲しがります。角度1では、ビューとモデルは「自動的に」更新されます...右ですか? – Mike

+1

いいえ、まったくありません。 –

答えて

1

いいえ、あなたはそれがpublic salary = this.salaryService.salaryが値をコピーし、給与への参照を代入されていない定義されている方法。それらはメモリ内の別個のインスタンスであるため、プレーヤコンポーネント内の給与がサービス内の給与と同じであるとは期待できません。

給与を支払ったプレーヤーがサービスに引き渡して操作する場合、ビューは正しいオブジェクトで操作されるように正しく調整されます。

次のようになります。 salary.service.ts

import {Injectable} from "@angular/core"; 

@Injectable() 
export class SalaryService { 
    constructor() { } 

    public setSalary = (player, value) => { 
     player.salary -= value; 
    }; 

} 

player.component.ts最後に

import { Component } from "@angular/core"; 
import { SalaryService } from "./salary.service"; 

@Component({ 
    selector: 'player', 
    template: ` 
    <div>{{player.salary}}</div> 
    <button (click)="updateSalary(player, 50)" type="button">Update Salary</button> 
    ` 
    providers: [SalaryService] 
}) 
export class PlayerComponent { 
    player = { id: 0, name: "Bob", salary: 50000}; 
    constructor(private salaryService:SalaryService) { 

    } 

    public updateSalary = (player, value) => { 
     this.salaryService.setSalary(player, value); 
    }; 
} 

、ここにあなたの周りの混乱とすることができますplunkerは以下のとおりです。 http://plnkr.co/edit/oChP0joWuRXTAYFCsPbr?p=preview

+0

あなたの説明をありがとう、記憶は私が考えていなかったものでした。私はあなたのプランカと遊んで、何が起こっているのかをよく理解しています。 – Mike

+0

これは愚かな質問かもしれませんが、サービスの中で「給与」を呼び出すのはどうですか? '{{salaryService.salary}}'それはメモリの単一のソースですか? – Mike

+0

あなたはコンポーネントでサービスを呼び出すことができますが、それはすべてのプレーヤーの給与をどこでも同じにします。 直接注入を使用する場合は、それがプライベートコンストラクタ変数であることが暗示されているため、SalaryServiceは一度インスタンス化され、同じインスタンスがすべてのプレーヤコンポーネントに挿入されます。それが望ましい行動であれば、偉大な、プレーヤーごとに給料があるならば、そうするのは賢明ではないでしょう。 – silentsod

関連する問題