返回博客主页
← 所有帖子

在 NativeScript 应用程序中使用 Angular 模块

2018 年 3 月 1 日 — 作者 Sebastian Witalec

提示:观看 YouTube 上的此视频,了解如何将 Angular Web 应用程序迁移到 NativeScript:将原生移动设备添加到您的 Angular 项目:迁移故事

就像所有蘑菇都是可以食用的,除了有些蘑菇你一生只能吃一次,NgModules 也一样 - 有些你可以到处导入,有些只能在每个应用程序中导入一次。

您知道哪些模块应该在任何地方导入,哪些只导入一次吗?

您知道每次在每个 @NgModule 中添加 NativeScriptModule 时会发生什么吗?

让我来帮助您。

每个应用程序一次(根模块)

NativeScriptModuleNativeScriptAnimationsModule 只能在您的 AppModule 中导入。如果您多次导入它们,则应用程序的性能可能会受到影响。

NativeScriptModule

NativeScriptModule - 提供运行 NativeScript 应用程序所必需的服务。最重要的是它提供了渲染器。由于每个延迟加载的模块都有自己的依赖项注入器,因此如果我们在每个延迟加载的模块中导入 NativeScriptModule,最终将得到一堆渲染器。这也会给 Angular 动画带来很多问题。

NativeScriptAnimationsModule

NativeScriptAnimationsModule - 通过 初始化关键动画元素 AnimationDriverAnimationBuilderAnimationStyleNormalizerAnimationEngine 来开始,但最重要的是它 围绕渲染器创建了一个包装器

错误

为了帮助您正确使用它们,我们将在这些模块中添加一些更改,这样当您多次导入其中任何一个时,您将看到类似于此的错误消息

  • 对于 NativeScriptModule - NativeScriptAnimationsModule has already been loaded.
  • 对于 NativeScriptAnimationsModule - Import NativeScriptAnimationsModule in the AppModule only.

任何地方

某些模块可以在(甚至应该)每个功能和延迟加载的模块中导入。

NativeScriptCommonModule

您应该在每个功能和延迟加载的模块中导入 NativeScriptCommonModule。但是,您不需要在 AppModule 中导入它,因为它应该已经由 NativeScriptModule 导出。

NativeScriptCommonModule - 使您可以访问常见的 Angular 指令(即 *ngFor*ngIf 等等),但它还为您提供了 NativeScript UI 组件(即 ListViewComponentActionBarComponent)。

需要时

还有一些模块,您应该只在需要时导入。

NativeScriptHttpClientModule

NativeScriptHttpClientModule(及其 已弃用 的旧兄弟 NativeScriptHttpModule) - 允许您进行 http 调用。

最佳实践:仅在以下模块中导入 NativeScriptHttpClientModule(或 NativeScriptHttpModule

  • 提供注入 HttpClient(或 Http)的服务
  • 声明注入 HttpClient(或 Http)的组件,但不要在它们只是注入使用 HttpClient(或 Http)的服务时声明它们。

NativeScriptFormsModule

NativeScriptFormsModule - 为您提供使用 [(ngModule)] 的双向绑定。

最佳实践类似于

哪里有烟,哪里就有火

或者用 Angular 的术语来说

哪里有 [(ngModule)],哪里就有 NativeScriptFormsModule

NativeScriptRouterModule

NativeScriptRouterModule - 为您提供了在 NativeScript 应用程序中进行导航的必要项目:RouterExtensions[nsRouterLink]

最佳实践:它应该在 AppModule 中导入,并且每个包含以下组件的延迟加载的捆绑包中只导入一次

  • 注入 RouterRouterExtensions(在构造函数中),或者
@Component({...})
export class MyComponent {  
    constructor(private router: RouterExtensions) { }
}
  • 在模板中使用 [nsRouterLink] 指令
    <label text="Go Home" [nsRouterLink]="['/home']"></label>

最后的建议 - 服务

永远不要在多个模块中提供相同的服务,因为这将为每个模块创建一个新的服务副本。

速查表

NgModule 从哪里导入 如何使用它
NativeScriptModule nativescript-angular/nativescript.module 始终添加到 AppModule
NativeScriptCommonModule nativescript-angular/common 不要添加到 AppModule
添加到其余模块
NativeScriptAnimationsModule nativescript-angular/animations 仅添加到 AppModule
仅在您需要 Angular 动画时使用
NativeScriptHttpClientModule nativescript-angular/http-client 仅在任何模块的服务或组件注入 HttpClient 时使用
NativeScriptFormsModule nativescript-angular/forms 在每个使用 [(ngModule)] 的双向绑定的模块中使用
NativeScriptRouterModule nativescript-angular/router 在模块的服务或组件使用导航时使用

进一步阅读

了解共享模块也很重要,共享模块允许您预先打包常用的指令和管道。

您可以阅读更多相关信息 在 Angular 文档中