Я хочу абстрагировать компонент Tree в моем проекте, конкретно JSTree. Поэтому я написал интерфейс и адаптер для JSTree, который реализует этот интерфейс. Я использую Injection Dependency из-за модульного тестирования.Angular - Dependency Inject объект/класс с конструктором, который имеет параметры
- Для построения дерева (jstree) необходим идентификатор DOM и данные JSON, необходимые для построения дерева.
- Данные извлекаются с сервера, что означает, что адаптер должен быть подходящим для конструктора, который должен построить три с данными.
- Проблема в том, когда я создаю конструктор, который я не могу использовать (я могу ввести местозаполнитель/идентификатор, но не данные из службы)
Классы видны на диаграмме классов (небольшая ошибка подключения между TreeService и провайдером должна быть агрегацией):
Проблема заключается в том, что TreeService должен извлекать данные с сервера, чтобы поставщик передал его конструктору JSTreeComponents для его создания. Это означает, что JsTreeComponent больше не может быть @Injectable(), который ограничивает тестируемость класса.
Вопросы:
- Должна ли TreeService построить/впрыскивать JsTreeComponent или если TreeComponent сделать это или событие Продлить его в качестве базового класса
- Как решить, что JsTreeComponent является инъекционным в угловой/Машинописи altrought конструктор должен вызываться с данными сервера (. пожалуйста не предлагают сделать это метод, как tree.loadData (JSON))
Возможный способ его создания внутри TreeService - Пример в angular2/машинопись но может быть angularjs тоже:
@Injectable()
export class TreeService {
chapters: any;
treeHandler: ITreeComponent;
readonly placeholder: string = 'tree-placeholder';
constructor(private treeProvider: TreeProvider,
@Inject(new JsTreeComponent(this.placeholder, ????data??)) tree: ITreeComponent) { }
initializeTree(placeholder: string): Observable<Response> {
let provider = this.treeProvider.getNodes();
provider.subscribe(
(data: any) => {
this.treeHandler = <ITreeComponent>(new JsTreeComponent(placeholder, data));
}
);
return provider;
}
}
Два способа показаны первый, чтобы создать его с «новым», но проблема в том, проверяемость. Второй заключается в том, чтобы вводить его, но проблема в том, что я не могу передать данные, загруженные из провайдера, чтобы построить дерево, и я не хочу использовать такую функцию, как .loadData (json) - он должен подумать о конструкторе.
Я мог бы также использовать Singletone, чтобы заставить JsTreeComponent быть построен с данными, но «обойти» Конструктор
почему косяк у передать данные из переменного класса –
инъекционного компонент к службе, как правило, не имеет смысла в Angular2.Мне непонятно, что вы пытаетесь выполнить. Почему вы хотите это сделать? –
Я мог бы также ввести его или расширить его в компоненте/контроллере. Только расширение решает проблему с Injection, но все же у меня проблема, как заставить передачу параметра данных в конструктор, я имею в виду, что я мог бы сделать это через super в конструкторе Components. – teter