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。