替代Angular 2.0中的$ scope

时间:2014-11-14 00:34:17

标签: angular angularjs-scope

在Angular 2.0中,没有$scope

有什么替代方案?如何在组件之间共享数据?指令中是否可以使用scope选项?更实际的是,目前是否有我能熟悉的替代方案?

我知道controller as,但我读到控制器也会被淘汰。

Angular团队已经开始对这场革命感到困惑。

6 个答案:

答案 0 :(得分:41)

Angular 2.0 正在使用this而不是$scope

2.0中出现的一个主要变化是控制器的死亡,以及对组件的新重视。 转向基于组件的应用程序的巨大优势是,定义其界面更容易;此外,HTML元素已在事件,属性和属性中具有易于映射的界面。

请参阅 AngularJS 1.3 迁移到 2.0 here。 另请参阅 Angular 2.0 here

的完整文档

答案 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。有远见的团队说:

  

It's too soon to start building anything with 2.0 code -- we're still in the very early stages of building out the project.

尝试在开发早期学习一些东西最终可能会浪费你的时间。话虽这么说,如果你想在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,该元素已订阅了必要的组件。