angular2 – 什么是等同于根范围?

所有! 我有这个组件,当我点击href它应该设置一个variables作为根范围,如果它是Angular 1像这样:

selector: 'my-component' template : ` <div (click)="addTag(1, 'abc')">` constructor() { this.addTag = function(id, desc){ myGlobalVar = { a: id, b: desc}; }; 

然后在我的父组件,页面本身(事实上)我应该做的事情是这样的:

 <my-component></my-component> <p>My Component is returning me {{ ?????? }} 

做这样的事情最好的办法是什么?

要实现全局variables,你可以实现一个共享服务。 您将能够保存数据,所有组件都可以访问它们。

为此,只需实施一项服务,并在增加应用程序时设置提供商:

 bootstrap(AppComponent, [ MySharedService ]); 

注意不要在要使用它的组件的providers属性中再次定义它。

样品

服务:

 export class MySharedService { data: any; dataChange: Observable<any>; constructor() { this.dataChange = new Observable((observer:Observer) { this.dataChangeObserver = observer; }); } setData(data:any) { this.data = data; this.dataChangeObserver.next(this.data); } } 

使用它到一个组件:

 @Component({ (...) }) export class MyComponent { constructor(private service:MySharedService) { } setData() { this.service.setData({ attr: 'some value' }); } } 

如果要通知组件数据已更新,则可以将可观察字段用于共享服务:

 @Component({ (...) }) export class MyComponent { constructor(private service:MySharedService) { this.service.dataChange.subscribe((data) => { this.data = data; }); } } 

看到这个问题的更多细节:

  • 代表团:Angular2中的EventEmitter或Observable

angular.io网站上的这个页面也可能让你感兴趣:

在Angular2中,范围的概念现在相当于组件或指令的成员variables和@Input属性。 当它们引用DOM元素时,可绑定属性还包括DOM元素本身的属性或属性。

在Angular1中,您可以在$rootScope上定义一个范围variables,并在一个深度嵌套的子范围内引用它,而不会显式传递给指令,因为范围inheritance的原型性质。 在Angular2中,没有范围inheritance。 如果要将父组件的作用域中的数据传递给直接的子作用域,则必须通过指令的@Input绑定来显式@Input 。 例如,通过指令的@Input属性myBinding将父组件作用域中的model属性传递到子指令的作用域中,例如<directive [myBinding]="model"></directive>

最接近于$ rootScope的是@ Thierry的答案:使用共享服务来检索和变异数据,这些数据可以通过DI注入到任何组件中。 与具有全球注射器的Angular1不同,Angular2引入了分层注射器的概念。 组件分级链中的每个组件都可以定义它自己的注入器。 在Angular2中,注入器的层次结构参与typesparsing,类似于使用$ scopeinheritance的$ scopevariables在Angular1中parsing。