Как написать класс помощника в typescript?
У меня проблема при использовании typeScript
с angular2
.
Я хочу создать один helper.ts
файл, экспортирующий многие классифицированные/функции, общие для повторного использования.
Но Helper class
нужно импортировать другие службы в конструктор, так что, когда другой импорт класса Helper class
, ему нужно установить параметр - это служба. Я не хочу этого.
Как я могу написать Helper class
, что я могу использовать где угодно, когда import {Helper} from ..
Это мой пример:
Helper.ts
import {TranslateService, TranslatePipe} from 'ng2-translate/ng2-translate';
import {Inject, Component} from 'angular2/core';
@Component({
providers: [TranslateService]
})
export class Helpper {
public trans;
public lang;
public properties;
constructor(trans: TranslateService) {
this.trans = trans;
//This is variable for translate function
this.lang = this.trans.currentLang;
this.properties = this.trans.translations[this.lang];
}
translate(key) {
return this.properties[key];
}
}
RenderTab.ts
import {Component, Inject, Injectable} from 'angular2/core';
import {Helper} from './helpper'
@Component({
providers: [Helper]
})
export class RenderTab {
public helper;
constructor(helper: Helper) {
this.helper = helper;
}
render() {
var test = this.helper.translate('string');
}
}
HomePage.ts
import {Component, Inject, Injectable} from 'angular2/core';
import {RenderTab} from './RenderTab'
@Component({
selector: 'div',
templateUrl: './HomePage.html',
providers: [RenderTab]
})
export class ColorPicker {
public renderTab;
constructor(renderTab: RenderTab) {
this.renderTab = renderTab;
var test = this.renderTab.render();
}
}
Пожалуйста, помогите мне, спасибо.
Ответы
Ответ 1
Прежде всего class Helper
должен быть сервисом, который следует вводить.
import {Injectable} from "@angular/core";
import {Http} from "@angular/http";
import {TranslateService} from "ng2-translate";
@Injectable()
export class Helper {
constructor(private http: Http, private translateService: TranslateService) {
}
}
Теперь вы можете просто вставить этот помощник и использовать его в любом компоненте, который вам нравится.
import {Helper} from "./helper.ts";
@Component({
...
})
export class MyComponent{
constructor(public helper: Helper) {}
}
Обновление: вам необходимо добавить службу в массив поставщиков корневого модуля, чтобы она работала
Ответ 2
Классы помощников должны содержать только статические функции или переменную, если они не отличаются от служб. Пожалуйста, исправьте меня, если я ошибаюсь.
Один из способов создания класса Helper без Injectable
или добавления его в providers
размещен здесь Благодаря k7sleeper
Копирование кода из указанной записи для быстрой справки.
utils.ts:
export default class Utils {
static doSomething(val: string) { return val; }
static doSomethingElse(val: string) { return val; }
}
Использование:
import Utils from './utils'
export class MyClass {
constructor()
{
Utils.doSomething("test");
}
}
Но, читая больше об этом, имеет смысл вводить их через Injectable
и providers
, но я бы все еще имел все методы как static
, а класс без constructor
Ответ 3
Класс Helper соответствует службе, и поскольку вы хотите добавить другую услугу, вам нужно добавить декоратор @Injectable (а не @Component):
Import {Injectable} from 'angular2/core';
@Injectable()
export class Helper {
(...)
}
Поскольку эта часть инъекции зависимостей, все параметры ее конструктора будут предоставлены самим Angular2. Вам не нужно предоставлять их самостоятельно и создавать себе этот класс, чтобы иметь возможность этого. Просто добавьте его туда, где вы хотите его использовать...
Затем вам необходимо обратиться к соответствующему провайдеру при загрузке приложения:
bootstrap(AppComponent, [ Helper ]);
Или на уровне компонента, но может использоваться только при обработке, инициируемой компонентом.
@Component({
(...)
providers: [ Helper ]
})
export class SomeComponent {
(...)
}
Для более подробной информации об инъекции зависимостей и иерархических инжекторах вы можете посмотреть на этот вопрос: