1

我有一些Angular 2服务具有相同的方法来解析json响应,处理错误等(例如,如果它是422错误陷阱例如)。Angular2 - 模块分离 - 最佳实践

很显然,我不希望这些方法复制并粘贴到每个服务中,但我似乎无法找到有关我应该在哪里放置此代码的任何指导。

他们不是类方法,只是目前在每个服务中相同的私有方法。

这里有一个例子:

private parseToString(jsonResponse: any){ 
    return Object.keys(jsonResponse).reduce(
     (prev, next) => prev.concat(jsonResponse[next].map(
     v => next + ' ' + v).join(', ')), []).join(', '); 
    } 

是否有某种方式来创建一个辅助模块或像一个Rails值得关注的是,你可以包括些什么呢?

例如说我有这个文件夹:

应用程序/服务

其中有我的各种.TS服务文件。

我可以创建“应用程序/服务/助手”文件夹,并把文件放在里面...但是那个.ts文件会怎么样?

例如。 parser-helper.ts可以是文件名,但是里面的代码是什么样的?它应该是一个模块吗?如果是这样,我怎样才能将其纳入服务?

例如,这是推荐的方式吗?

应用程序/服务/助理/解析器helper.module.ts

module parserHelperModule { 

    export function helperA(){} 
    export function helperB(){} 

} 
+1

那么TypeScript有函数,类,方法等。你可以自由地创建一个函数,从模块中导出它,然后导入它并在任何你想要的地方使用它。 –

+0

我添加了一些示例代码,我认为您的意思是我尝试。 – rmcsharry

回答

1

您可以将通用代码作为以下公共服务本身使用

export class CommonService { 
    public parseToString(jsonResponse: any){ 
      return Object.keys(jsonResponse).reduce(
         (prev, next) => prev.concat(jsonResponse[next].map(
          v => next + ' ' + v).join(', ')), []).join(', '); 
    } 
    public someOtherMethod(){ 

    } 
} 

因此你可以导入类的任何地方进行的跨应用和使用它们

注意:当你定义在单个服务常用的方法,以确保它们是公共

更新1

是的,这是一个很好的做法,使用一个单独的模块,服务于所有的通用代码,并使主AppModule导入看起来像这样的CommonModule

@NgModule({ 
    imports: [ 
       HttpModule, Logger, Toaster, ... 
       ], 
    declarations: [ CommonCmoponents 
       ], 
    providers:[Service1, Service2 ] 
}) 
export class CommonModule { } 

确保您的通用模块只是作为一个集合,这CommonModule不应含有

  1. 浏览器模块
  2. 自举组件

你可能会寻找一个对下方图像有分离关注点

enter image description here

+0

谢谢,但由于某种原因,它创造了一个奇怪的或矫枉过正的服务。或者至少有点误导,因为'CommonService'本身并不是一项真正的服务,而只是一些辅助代码。 – rmcsharry

+0

如果你不希望它是服务服务它没有@Injectable(),它仍然是一个简单的类 – Aravind

+0

啊我明白了。而且你的更新可能更多我在想(来自Rails背景),所以谢谢,我从你的答案中学到了很多东西。 – rmcsharry

3

在解析器helper.ts:

export function parseToString(jsonResponse: any): string { 
    ... 
} 

在任何其它文件打字稿:

import { parseToString } from './relative/path/to/parser-helper'; 

... 
const s = parseToString(response); 
+0

这很有趣 - 根本不涉及任何模块。这是在Angular2应用程序中分享通用代码的推荐方式吗? – rmcsharry

+0

涉及两个模块。如[文档](https://www.typescriptlang.org/docs/handbook/modules.html)中所述,*在TypeScript中,与ECMAScript 2015中一样,包含顶级导入或导出的任何文件都被视为模块。* –

+0

真棒,感谢您的链接和斜体。我希望我现在可以将两个答案标记为正确! – rmcsharry