我有一个仅会从路由文件中引用的组件。
因此,我永远不会从html模板文件中引用它(例如,我永远不会使用<app-my-component></app-my-component>
)。
这是否意味着我可以完全删除选择器?
@Component({
selector: 'app-my-component', // Can I remove this line ?
templateUrl: './mc.component.html',
styleUrls: ['./mc.component.scss']
})
export class MyComponentComponent { }
那模块呢? 这是否意味着我也可以将其从声明部分中删除?
@NgModule({
declarations: [
MyComponent // Can I remove this line ?
],
exports: [...],
})
export class MyModule { }
答案 0 :(得分:2)
是的,您可以删除以下行:
selector: 'app-my-component',
以及:
templateUrl: './mc.component.html'
styleUrls: ['./mc.component.scss']
因为您说过永远不会在模板中使用此组件,这意味着它不需要任何样式(scss)或模板本身(.html)。
这是否意味着要成为一种BaseComponent?从经验来看,这是可能的,尽管最好不要派生模板(html)。
第二个问题:
MyComponent // Can I remove this line ?
我对此表示怀疑。只是尝试一下? @Reactgular状态是不可能的,因为Webpack将“从捆绑包中摇晃树”。但是,您仍然可以轻松地尝试一下,看看自己。
答案 1 :(得分:2)
我有一个仅会从路由文件中引用的组件。因此,我永远不会从html模板文件中引用它。
选择器是Web组件规范的一部分。您可以通过许多其他方式来动态创建没有模板选择器的组件,但是元数据仍然需要它。我确信Angular可以将其设置为可选,但人们更可能会忘记应用它,因此引发错误比忽略它可以帮助更多的人。
这是否意味着我也可以将其从声明部分中删除?
如果没有声明,该组件将被WebPack摇晃并从捆绑中删除。由于组件是模块的一部分,因此必须对其进行声明,并且AOT编译器正是通过此声明来发现和处理组件。
仅声明组件是不够的。如果Angular组件没有找到对选择器的任何引用,它也可以从构建中摇晃它。防止这种情况发生的唯一方法是也将组件声明为入口组件。入口组件定义模块中的用法,以便Angular至少可以看到一种使用方式。
我们无需为路由器执行此操作,因为它会自动添加它。
答案 2 :(得分:1)
路由器使用ViewContainerRef.createComponent()
,不需要选择器来匹配HTML。因此,您可以删除selector: 'app-my-component'
。
但是,您不能从模块中删除以下行,因为它告诉Angular MyComponent
是该模块的一部分:
declarations: [
MyComponent // You can't remove this line because it is a part of module
],
顺便说一句。您只能创建和使用模块。 此外,Angular CLI具有仅创建模块的命令。例如:
ng g m SharedModule
答案 3 :(得分:1)
Angular使用组件选择器创建一个Element节点,但是我认为可以忽略它,在这种情况下,angular将使用 ng-component 不知道它是否对于最新版本的angular仍然可以这样工作,并请记住,每个指令或组件都必须是angular模块的一部分
答案 4 :(得分:0)
组件选择器
如果删除选择器,则意味着您需要动态创建组件,并在html端路由该示例,您需要的组件选择器将是 ng-component
即使您不使用选择器,在使用过程中也会非常方便 进行调试,因此考虑将选择器的名称保留为最佳做法,选择器的另一个好处是,当您创建全局样式并尝试对选择器的组件库进行样式设置时,例如,请检查primeng componenet库
组件声明参考
这是必须将任何已创建的组件添加到模块声明列表中,否则,如果您尝试使用它,将会得到与此相关的错误
Error: Component DashboardComponent is not part of any NgModule or
the module has not been imported into your module.