【问题标题】:Angular 2 Service Two-Way Data BindingAngular 2 服务双向数据绑定
【发布时间】:2017-03-17 13:06:19
【问题描述】:

我有一个salary.service 和一个player.component,如果salary 变量在服务中更新,播放器组件中的视图会更新吗?还是在 Angular 2 中不是这样?

当页面第一次加载时,我在 player.component 视图中看到了 50000,所以我知道两者是一起工作的。它正在更新让我难过的价值。

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

}

编辑

对于任何想了解我如何解决问题的人,这里是 Plunker:

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

【问题讨论】:

  • 这与角度无关。它只是 JavaScript。更新对象中的字段不会自动更新另一个对象中的同名字段。我还建议您学习类方法的语法,并选择更好的名称:例如,您的 setSalary 方法不会设置salaty。它从工资中减去给定的值。
  • 我不敢苟同,在 Angular 1 中,视图和模型会“自动”更新......对吗?
  • 不,一点也不。
  • 这不就是双向数据绑定吗?
  • 不,这不是双向数据绑定。双向数据绑定是,由于 ng-model,视图会在模型更改时自行更新,而模型会在用户在输入字段中输入内容时自行更新。两个范围之间也可以有双向绑定(例如,控制器范围和指令隔离范围)。但是你在那里拥有的东西根本没有约束力。它只是将服务字段的值复制到组件的字段中。

标签: angular typescript angular2-services


【解决方案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);
    };
}

最后,这是一个你可以玩弄的笨蛋:http://plnkr.co/edit/oChP0joWuRXTAYFCsPbr?p=preview

【讨论】:

  • 谢谢你的解释,记忆是我没想到的。我会和你的 Plunker 一起玩,更好地了解发生了什么。
  • 这可能是一个愚蠢的问题,但是在服务中直接调用salary 怎么样? {{ salaryService.salary }} 那会是单一的内存来源吗?
  • 您可以在组件中调用该服务,但这会使每个玩家的薪水在任何地方都相同。如果您使用直接注入,正如它是一个私有构造函数变量所暗示的那样,那么 SalaryService 会被实例化一次,并且相同的实例会被放入您制作的每个玩家组件中。如果这是期望的行为,那很好,如果每个球员都有薪水,那么这样做是不明智的。
  • 好吧,起薪为 50,000 美元,随着用户开始组建他们的团队,无论球员的价值如何,都会从 50,000 美元中扣除……希望这是有道理的。如果您对 Fantasy Football 有所了解,那就是 Draft Kings 和其他人。我只是在本地尝试过,还有 Plunker,它就像一个冠军!再次感谢您的帮助和耐心。
  • Np,工资池或支出上限对于按用户共享是有意义的。很高兴我能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 2017-01-20
  • 2017-03-16
  • 2017-03-06
  • 2016-10-12
  • 1970-01-01
相关资源
最近更新 更多