Создать импортируемый класс для трубы - Angular 4 - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь разработать канал для замены определенных ключевых слов правильными строками. Чтобы иметь чистую структуру для этого канала, я пытаюсь сохранить мои ключевые слова и строку в другом файле, и вот код:

import { Injectable } from '@angular/core';
import { AdvEnDictionary } from './advertiser-dict/adv-en-dictionary';
import { AdvFaDictionary } from './advertiser-dict/adv-fa-dictionary';

@Injectable()
export class AdvertiserDictionary {
    constructor(
        private advEnDictionary: AdvEnDictionary['words'], 
        private advFaDictionary: AdvFaDictionary['words']
    ) {}

    getString(keyword:string, lang:string) {
         switch(lang) {
            case 'fa':
                 return this.advFaDictionary[keyword];
            break;
            case 'en':
                 return this.advEnDictionary[keyword];
            break;
            default: 
                 return this.advFaDictionary[keyword];
         }
    }
}

И труба:

import { Pipe, PipeTransform } from '@angular/core';
import { CookieService } from 'ngx-cookie';
import { AdvertiserDictionary } from '../classes/advertiser-dictionary';
import { PublisherDictionary } from '../classes/publisher-dictionary';

@Pipe({
  name: 'translation'
})
export class TranslationPipe implements PipeTransform {
  constructor(private cookieService: CookieService,
    private advertiserDictionary: AdvertiserDictionary, 
    private publisherDictionary: PublisherDictionary, 
  ) {}

  transform(value: string, args?: any): any {
    var [prefix, keyword] = value.split("-");
    var lang = this.cookieService.get("lang");
    switch(prefix.toLowerCase()) {
      case 'pub':
        return this.publisherDictionary.getString(
          keyword.toUpperCase(),
          lang
        );
      break;
      case 'adv':
        return this.advertiserDictionary.getString(
          keyword.toUpperCase(),
          lang
        );
      break;
    }
  }

}

И что я продолжаю получать в разных сценариях:

  • Когда я просто добавляю класс в канал, я получаю сообщение об ошибке «Нет провайдера» для классов
  • Когда я добавляю класс в поставщики модулей, я получаю «недопустимые аргументы» для класса, а также я не хочу, чтобы этот класс был во всем приложении, я просто хочу, чтобы он использовался в моей трубе.

1 Ответ

0 голосов
/ 29 августа 2018

вы можете создать модуль, который включает AdvertiserDictionary и PublisherDictionary

@NgModule({
  imports: [CommonModule], 
  declarations: [
    TranslationPipe  
  ],
  providers: [AdvertiserDictionary,PublisherDictionary], 
  exports:[TranslationPipe]  
})
export class TranslationModule {}

но вам нужно импортировать модуль трансляции, если вы хотите использовать свой Pipe

В общем

  • в импорте: все необходимые вам модули
  • в декларациях: комплектующие и трубы
  • в провайдерах: все услуги (все @Inject)
  • в экспорте: компоненты, которые вы используете вне модуля
...