首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用angular2从服务更新组件中的变量更改

使用angular2从服务更新组件中的变量更改
EN

Stack Overflow用户
提问于 2016-01-11 13:01:18
回答 2查看 85K关注 0票数 78

我的应用程序有一个包含名称的NameService。

应用程序有两个子组件,导航栏和TheContent,它们引用了这个服务。每当服务中的名称更改时,我希望它在其他两个组件中都更新。我该怎么做呢?

代码语言:javascript
复制
import {Component, Injectable} from 'angular2/core'

// Name Service

@Injectable()
class NameService {
  name: any;
  constructor() {
    this.name = "Jack";
  }
  change(){
    this.name = "Jane";
  }
}

// The navbar
@Component({
  selector: 'navbar',
  template: '<div>This is the navbar, user name is {{name}}.</div>'
})
export class Navbar {
  name: any;
  constructor(nameService: NameService) {
    this.name = nameService.name;
  }
}

// The content area
@Component({
  selector: 'thecontent',
  template: '<div>This is the content area. Hello user {{name}}. <button (click)=changeMyName()>Change the name</button></div>'
})
export class TheContent {

  name: any;

  constructor(public nameService: NameService) {
    this.name = nameService.name;
  }
  changeMyName() {
       this.nameService.change();
     console.log(this.nameService.name);
  }
}


@Component({
  selector: 'app',
  providers: [NameService],
  directives: [TheContent, Navbar],
  template: '<navbar></navbar><thecontent></thecontent>'
})
export class App {
  constructor(public nameService: NameService) {
  }
}
EN

回答 2

Stack Overflow用户

发布于 2016-01-11 13:13:30

在服务中提供一个事件,并在组件中订阅它:

代码语言:javascript
复制
@Injectable()
class NameService {
  name: any;
  // EventEmitter should not be used this way - only for `@Output()`s
  //nameChange: EventEmitter<string> = new EventEmitter<string>();
  nameChange: Subject<string> = new Subject<string>();
  constructor() {
    this.name = "Jack";
  }
  change(){
    this.name = 'Jane';
    this.nameChange.next(this.name);
  }
}
代码语言:javascript
复制
export class SomeComponent { 
  constructor(private nameService: NameService) {
    this.name = nameService.name;
    this._subscription = nameService.nameChange.subscribe((value) => { 
      this.name = value; 
    });
  }

  ngOnDestroy() {
   //prevent memory leak when component destroyed
    this._subscription.unsubscribe();
  }
}

另请参阅

angular.io - COMPONENT INTERACTION - Parent and children communicate via a service

票数 109
EN

Stack Overflow用户

发布于 2016-01-11 16:18:44

由于NameService中的name是一个基本类型,因此您将在服务和组件中获得不同的实例。当您在NameService中更改name时,组件属性仍然具有初始值,并且绑定不能按预期工作。

您应该在这里应用angular1“点规则”并绑定到引用类型。更改NameService以存储包含该名称的对象。

代码语言:javascript
复制
export interface Info {
   name:string;
}

@Injectable()
class NameService {
  info: Info = { name : "Jack" };
  change(){
    this.info.name = "Jane";
  }
}

您可以绑定到此对象并自动获取对name属性的更新。

代码语言:javascript
复制
// The navbar
@Component({
  selector: 'navbar',
  template: '<div>This is the navbar, user name is {{info.name}}.</div>'
})
export class Navbar {
  info: Info;
  constructor(nameService: NameService) {
    this.info = nameService.info;
  }
}
票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34714462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档