Mir ist klar, dass dies eine etwas ältere Frage ist, aber ich wollte nur darauf hinweisen, dass Sie die Modellvariable Ihrer Test-Widget-Klasse falsch hinzugefügt haben. Wenn Sie eine Modellvariable benötigen, sollten Sie nicht versuchen, sie über den Komponentenkonstruktor zu übergeben. Sie sollen nur Dienste oder andere Arten von Injektionsmitteln auf diese Weise weitergeben. Wenn Sie Ihr Test-Widget innerhalb einer anderen Komponente instanziieren und ein Modellobjekt als übergeben müssen, würde ich die Verwendung der Entwurfsmuster OnInit und Input / Output mit eckigem Kern empfehlen.
Als Beispiel sollte Ihr Code wirklich so aussehen:
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 //This service should
//usually be provided at the module level, not the component level
) {}
ngOnInit() {
this.load();
}
private load() {
}
}
Eine Klasse, die im Wesentlichen nur eine Struktur / ein Modell ist, sollte nicht eingefügt werden, da dies bedeutet, dass Sie nur eine einzige gemeinsam genutzte Instanz dieser Klasse innerhalb des bereitgestellten Bereichs haben können. In diesem Fall bedeutet dies, dass jedes Mal, wenn testWidget instanziiert wird, eine einzelne Instanz von Model vom Abhängigkeitsinjektor erstellt wird. Wenn es auf Modulebene bereitgestellt würde, hätten Sie nur eine einzige Instanz, die von allen Komponenten und Diensten innerhalb dieses Moduls gemeinsam genutzt wird.
Stattdessen sollten Sie den objektorientierten Standardpraktiken folgen und eine private Modellvariable als Teil der Klasse erstellen. Wenn Sie beim Instanziieren der Instanz Informationen an dieses Modell übergeben müssen, sollten diese von einem Dienst (injizierbar) verwaltet werden, der von bereitgestellt wird das übergeordnete Modul. Auf diese Weise sollen sowohl die Abhängigkeitsinjektion als auch die Kommunikation im Winkel ausgeführt werden.
Wie einige der anderen erwähnt, sollten Sie Ihre Modellklassen auch in einer separaten Datei deklarieren und die Klasse importieren.
Ich würde dringend empfehlen, zur Referenz zur eckigen Dokumentation zurückzukehren und die Basisseiten zu den verschiedenen Anmerkungen und Klassentypen zu lesen:
https://angular.io/guide/architecture
Beachten Sie insbesondere die Abschnitte zu Modulen, Komponenten und Diensten / Abhängigkeitsinjektion, da diese für das Verständnis der Verwendung von Angular auf architektonischer Ebene von entscheidender Bedeutung sind. Angular ist eine sehr architekturintensive Sprache, weil sie so hoch ist. Die Trennung von Bedenken, Abhängigkeitsinjektionsfabriken und die Javascript-Versionierung für die Vergleichbarkeit des Browsers werden hauptsächlich für Sie erledigt. Sie müssen jedoch die Anwendungsarchitektur korrekt verwenden, da sonst die Dinge nicht wie erwartet funktionieren.