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.

Я мог бы создать папку «app/services/helpers» и поместить в нее файл ... но что входит в этот файл .ts?

например. parser-helper.ts может быть именем файла, но как выглядит код внутри? Должен ли он быть модулем? Если да, то как я могу включить его в сервис?

Например, это рекомендуемый способ сделать это?

приложения/услуги/хелперы/парсер-helper.module.ts

module parserHelperModule { 

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

} 
+1

Well 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(){ 

    } 
} 

Таким образом, вы можете импортировать класс в любом месте accross приложения и использовать их

Примечание: При определении общих методов в единый сервис, убедитесь, что они являются общедоступными

Update 1:

Да, это хорошая практика использования отдельного модуля, который обслуживает все распространенные коды и делает основной AppModule для импорта CommonModule, который будет выглядеть.

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

Убедитесь, что ваш общий модуль просто служит в качестве коллекции, это CommonModule не должен содержать

  1. Browser Модуль
  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

Смежные вопросы