在Angular 2.0中,没有$scope
。
有什么替代方案?如何在组件之间共享数据?指令中是否可以使用scope
选项?更实际的是,目前是否有我能熟悉的替代方案?
我知道controller as
,但我读到控制器也会被淘汰。
Angular团队已经开始对这场革命感到困惑。
答案 0 :(得分:41)
Angular 2.0 正在使用this
而不是$scope
。
2.0中出现的一个主要变化是控制器的死亡,以及对组件的新重视。 转向基于组件的应用程序的巨大优势是,定义其界面更容易;此外,HTML元素已在事件,属性和属性中具有易于映射的界面。
的完整文档答案 1 :(得分:17)
在Angular2中,您使用共享服务而不是$scope
https://angular.io/docs/ts/latest/cookbook/component-communication.html
@Injectable()
class SharedService {
someState:String;
someEventStream:Subject<String> = new Subject<String>();
}
@Component({
selector: ...,
providers: [SharedService]
})
class MyComponent {
constructor(private sharedService:SharedService) {}
}
对于每个提供商([SharedService]
是[{provide: SharedService, useClass: SharedService}]
的缩写),在上面的示例中,维护了一个实例。
此类提供者的范围是提供它的组件,当没有后代注册了相同的提供者时,它是后代。
当一个组件请求一个依赖项constructor(private sharedService:SharedService)
时,Angulars DI(依赖注入)开始查看组件自己的提供者,然后向上看向根组件,然后是在bootstrap注册的提供者。它返回它找到的第一个。
如果两个组件注入相同的实例(来自同一个提供者),那么他们可以通过订阅和发出Subject
的事件或读取和写入状态或通过调用方法来使用此服务进行通信。服务。
答案 2 :(得分:6)
使用controller as
是一种习惯于在没有$scope
的情况下工作的好方法,尽管您仍然需要$scope
来处理观察者和事件等一些事情。在Angular 2.0中并没有真正删除控制器。但它不会等同于ng-controller
。您将拥有基本上封装控制器和视图的指令,而不是拥有控制器和视图。
答案 3 :(得分:3)
我根本不担心2.0。有远见的团队说:
尝试在开发早期学习一些东西最终可能会浪费你的时间。话虽这么说,如果你想在Angular 2.0上获得一个快速启动,1.3引入的新路由器 - 截至目前 - 他们打算用于2.0的路由器
答案 4 :(得分:3)
Angular 2不会像Angular 1那样在组件之间共享数据。相反,他们所做的是通过在模板中使用数据并传递事件来传递数据(通过使用事件默认情况下的气泡行为)。并且您可以使用组件类从模式访问数据(如果您不知道我的意思,请在Youtube上查看1000000000“角度2 - 如何开始”视频)。
答案 5 :(得分:0)
我们可以做到这一点,而无需将服务注入组件类。通过使用rxjs主题“行为主题”,该主题可以承载与$ scope变量相同的数据
这里是一个stackblitz的示例,其中我在const letter
中导出一个sub.service.ts
,该元素已订阅了必要的组件。