Zdaję sobie sprawę, że jest to nieco starsze pytanie, ale chciałem tylko zaznaczyć, że nieprawidłowo dodałeś zmienną modelu do klasy widżetu testowego. Jeśli potrzebujesz zmiennej modelu, nie powinieneś próbować przekazywać jej przez konstruktor komponentu. Masz zamiar przekazywać w ten sposób tylko usługi lub inne typy elementów iniekcyjnych. Jeśli tworzysz wystąpienie widgetu testowego w innym komponencie i musisz przekazać obiekt modelu jako, polecam użycie wzorców projektowych OnInit i Input / Output z rdzeniem kątowym.
Na przykład Twój kod powinien naprawdę wyglądać mniej więcej tak:
import { Component, Input, OnInit } from "@angular/core";
import { YourModelLoadingService } from "../yourModuleRootFolderPath/index"
class Model {
param1: string;
}
@Component({
selector: "testWidget",
template: "<div>This is a test and {{model.param1}} is my param.</div>",
providers: [ YourModelLoadingService ]
})
export class testWidget implements OnInit {
@Input() model: Model;
private _model: Model;
constructor(
private _yourModelLoadingService: YourModelLoadingService
) {}
ngOnInit() {
this.load();
}
private load() {
}
}
Klasa, która jest po prostu strukturą / modelem, nie powinna być wstrzykiwana, ponieważ oznacza to, że możesz mieć tylko jedną współdzieloną instancję tej klasy w zakresie, w jakim została dostarczona. W tym przypadku oznacza to, że za każdym razem, gdy tworzona jest instancja testWidget, przez wstrzykiwacz zależności jest tworzone pojedyncze wystąpienie modelu. Gdyby został dostarczony na poziomie modułu, miałbyś tylko jedną instancję współużytkowaną przez wszystkie komponenty i usługi w tym module.
Zamiast tego powinieneś postępować zgodnie ze standardowymi praktykami zorientowanymi obiektowo i tworzyć prywatną zmienną modelu jako część klasy, a jeśli potrzebujesz przekazać informacje do tego modelu podczas tworzenia instancji, powinno to być obsługiwane przez usługę (wstrzykiwalną) zapewnianą przez moduł nadrzędny. W ten sposób zarówno wstrzykiwanie zależności, jak i komunikacja mają być wykonywane w trybie kątowym.
Ponadto, jak wspomniano wcześniej, należy zadeklarować klasy modelu w oddzielnym pliku i zaimportować klasę.
Zdecydowanie polecam powrót do dokumentacji dotyczącej kątów i przejrzenie podstawowych stron dotyczących różnych adnotacji i typów zajęć:
https://angular.io/guide/architecture
Należy zwrócić szczególną uwagę na sekcje poświęcone modułom, składnikom i usługom / iniekcji zależności, ponieważ są one niezbędne do zrozumienia, jak używać Angular na poziomie architektonicznym. Angular to język o bardzo ciężkiej architekturze, ponieważ jest na tak wysokim poziomie. Rozdzielanie problemów, fabryki wstrzykiwania zależności i wersjonowanie javascript w celu zapewnienia porównywalności przeglądarek są obsługiwane głównie za Ciebie, ale musisz poprawnie używać architektury ich aplikacji, inaczej okaże się, że rzeczy nie działają zgodnie z oczekiwaniami.