Angular 2 中的组件和指令有什么区别?
What is the difference between component and directive in Angular 2?
我一直在努力理解框架中这两个概念之间的区别。
我很熟悉 AngularJS 1.x 中的指令,Angular 2 中的组件和指令似乎与这个概念非常相似...
您可以将任何组件视为带有视图的指令。
后果
基于只有组件有视图的事实,有几个后果,例如:
- 只有组件可以定义
directives
以用于组件本身及其作为根的整个子树。
- 只有组件可以定义
pipes
用于组件及其根的整个子树。
- 只有组件可以定义
viewEncapsulation
,因为它们可以有视图,这与指令相反
- 当框架为给定组件创建
ElementInjector
时,它将被标记为 Host
注入器。
- 将为组件创建单独的变更检测器实例(并且分别只有组件可以定义变更检测策略)。
更多详情
Angular2中定义组件的经典方式是:
@Component({
selector: '...',
// ...
})
@View({
template: '...'
})
class ComponentCtrl {...}
@View
装饰器帮助您为给定组件定义视图。最初它是在一个单独的装饰器中外部化的(就像上面的例子一样),因为 Angular 团队计划允许单个组件具有多个视图定义(一个用于组件将要运行的每个平台)。
最近这个装饰器被删除了,所以目前你可以定义一个组件:
@Component({
selector: '...',
template: '...',
//...
})
class ComponentCtrl {...}
通过这种方式,您可以获得相同的结果,但输入的次数会少一些。在内部 Angular 2 将根据您为 @Component
装饰器设置的属性添加适当的视图元数据。
我一直在努力理解框架中这两个概念之间的区别。
我很熟悉 AngularJS 1.x 中的指令,Angular 2 中的组件和指令似乎与这个概念非常相似...
您可以将任何组件视为带有视图的指令。
后果
基于只有组件有视图的事实,有几个后果,例如:
- 只有组件可以定义
directives
以用于组件本身及其作为根的整个子树。 - 只有组件可以定义
pipes
用于组件及其根的整个子树。 - 只有组件可以定义
viewEncapsulation
,因为它们可以有视图,这与指令相反 - 当框架为给定组件创建
ElementInjector
时,它将被标记为Host
注入器。 - 将为组件创建单独的变更检测器实例(并且分别只有组件可以定义变更检测策略)。
更多详情
Angular2中定义组件的经典方式是:
@Component({
selector: '...',
// ...
})
@View({
template: '...'
})
class ComponentCtrl {...}
@View
装饰器帮助您为给定组件定义视图。最初它是在一个单独的装饰器中外部化的(就像上面的例子一样),因为 Angular 团队计划允许单个组件具有多个视图定义(一个用于组件将要运行的每个平台)。
最近这个装饰器被删除了,所以目前你可以定义一个组件:
@Component({
selector: '...',
template: '...',
//...
})
class ComponentCtrl {...}
通过这种方式,您可以获得相同的结果,但输入的次数会少一些。在内部 Angular 2 将根据您为 @Component
装饰器设置的属性添加适当的视图元数据。