angular - 如何避免在 Angular 中暴露内部组件
问题描述
假设我有一个OutlookBarComponent
包含一些类似 Microsoft Outlook 的栏。对于每个条,都有一个子组件OutlookBarItemComponent
。OutlookBarComponent
和都OutlookBarItemComponent
封装在 中ControlModule
,以便我可以在另一个业务模块中使用它们:
import { OutlookBarComponent, OutlookBarItemComponent } from 'control/control.module';
@NgModule({
//...
declarations: [
OutlookBarComponent,
OutlookBarItemComponent,
]
})
export class BusinessModule { }
这工作正常。
由于OutlookBarItemComponent
实际上是一个内部组件,我不想BusinessModule
知道它。但是在没有导入和声明OutlookBarItemComponent
的情况下BusinessModule
,Angular 会抱怨
'app-outlook-bar-item' 不是已知元素
我的问题是:
有没有办法在
OutlookBarItemComponent
不暴露的情况下用作内部组件BusinessModule
?在这种情况下,将逻辑分成
OutlookBarComponent
and是一个好习惯OutlookBarItemComponent
吗?
解决方案
对于 Item1,Angular 遵循 ES6 模块概念,您需要将文件导出到其他位置才能导入。同样,您需要在 Modules 的声明属性下声明这些组件。因此,Angular 编译器可以轻松识别模板文件中的自定义元素何时出现。如果要在其他模块中使用该组件,还需要导出。
对于 Item2,根据一般准则,您的组件需要很纤薄,应该包含 View/presentation Logic。您可以将业务逻辑移动到服务中,这些服务可以在其他组件中重用。还有智能和愚蠢的组件架构。智能组件将执行与功能相关的所有业务逻辑。哑组件将接收数据作为输入,仅用于演示逻辑。
推荐阅读
- java - 通过java从另一台机器连接MySQL数据库
- java - 如何从字符串中分离许多不同的单词(Java)
- xslt - xsl 选取以下兄弟姐妹的文本值
- azure - 从本地机器连接天蓝色数据库容器?
- php - 如何在 Laravel 5.6 中重定向到以前的 URL 和预期
- clojure - Clojure:doseq 函数从上到下打印数字范围
- r - R Mojave 模糊石英窗
- swift - 无法从 Firebase 查看字典数据
- ios - 移动 UICollectionViewCell 会导致 invalidateItemsAtIndexPaths 出错
- javascript - 从 json 响应对象中过滤数据