Wie deklariere ich eine Modellklasse in meiner Angular 2-Komponente mit TypeScript?
Ich bin neu Eckig 2 und Typoskript und ich versuche zu Folgen best practices.
Anstelle der Verwendung einer einfachen JavaScript-Modell ({ }), ich bin versucht zu erstellen Typoskript Klasse.
Jedoch, Winkel 2 nicht scheinen es zu mögen.
Mein code ist:
import { Component, Input } from "@angular/core";
@Component({
selector: "testWidget",
template: "<div>This is a test and {{model.param1}} is my param.</div>"
})
export class testWidget {
constructor(private model: Model) {}
}
class Model {
param1: string;
}
und ich verwende es als:
import { testWidget} from "lib/testWidget";
@Component({
selector: "myComponent",
template: "<testWidget></testWidget>",
directives: [testWidget]
})
Ich bin immer ein Fehler von Winkel:
AUSNAHME: nicht lösen Können alle Parameter für testWidget: (?).
Also dachte ich, das Modell noch nicht definiert ist... ich werde es verschieben nach oben!!!
Außer jetzt bekomme ich die exception:
ORIGINAL-EXCEPTION: Kein provider für das Modell!
Wie kann ich dies erreichen??
Edit: vielen Dank an alle für die Antwort. Er führte mich auf den richtigen Pfad.
Um zu injizieren, das in den Konstruktor, die ich brauche, um es der Anbieter auf die Komponente.
Diese scheint zu funktionieren:
import { Component, Input } from "@angular/core";
class Model {
param1: string;
}
@Component({
selector: "testWidget",
template: "<div>This is a test and {{model.param1}} is my param.</div>",
providers: [Model]
})
export class testWidget {
constructor(private model: Model) {}
}
InformationsquelleAutor der Frage Scottie | 2016-07-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde versuchen, diese:
Teilen Sie Ihre Modell in einer separaten Datei namens
model.ts
:Importieren Sie Sie in Ihre Komponenten. Dies wird Ihnen den zusätzlichen Vorteil des seins in der Lage, es zu benutzen, die in anderen Komponenten:
Initialisieren der Komponente:
Zugang, es auch entsprechend in der html:
Möchte ich hinzufügen, dass zu der Antwort auf einen Kommentar von @PatMigliaccio weil es wichtig ist, die Anpassung an die neuesten tools und Technologien:
InformationsquelleAutor der Antwort Brendon Colburn
Liegt das problem, dass Sie noch nicht Hinzugefügt
Model
entweder diebootstrap
(die machen es zu einem singleton), oder dieproviders
array der Komponente definition:Und ja, Sie sollte definieren
Model
über dieComponent
. Aber besser wäre es, um es in seine eigene Datei.Aber wenn Sie wollen, dass es nur eine Klasse aus, die Sie erstellen können mehrere Instanzen, die Sie besser verwenden Sie einfach
new
.InformationsquelleAutor der Antwort PierreDuc
In Ihrem Fall sind Sie mit Modell auf der gleichen Seite, aber Sie haben es erklärt, nachdem die Komponente der Klasse, so dass Sie verwenden müssen
forwardRef
zu findenClass
. Nicht vorziehen, dies zu tun, haben immermodel
Objekt in separate Datei.Darüber hinaus müssen Sie ändern Sie die Ansicht interpolation beziehen sich auf das korrekte Objekt
Besser, was Sie tun sollten ist, können Sie Ihre
Model
- Klasse definieren, die in andere Datei und dann importieren Sie es als eine, wenn Sie es benötigen. Auchexport
bevor Sie die Klasse name, so können Sie es importieren.InformationsquelleAutor der Antwort Pankaj Parkar
mein code ist
und das html geht das so :
InformationsquelleAutor der Antwort Ahmed Basha
Können Sie die Winkel-cli als die Kommentare im @brendon Antwort vorschlagen.
Vielleicht wollen Sie auch zu versuchen:
Beachten Sie:
ng g class
!==ng g c
Allerdings können Sie mit
ng g cl
als shortcut-je nach Winkel-cli-version.InformationsquelleAutor der Antwort rxx
Ich weiß, dies ist eine etwas ältere Frage, aber ich wollte nur darauf hinweisen, dass Sie haben, fügen Sie der Modell-Variablen in den test widget-Klasse falsch. Wenn Sie ein Modell variabler, sollten Sie nicht versuchen, Sie zu passieren, durch das Komponenten-Konstruktor. Sie sind nur dazu gedacht, zu übergeben, Dienstleistungen oder andere Arten von Injektionen, die Art und Weise. Wenn Sie instanziieren Ihre test-widget innerhalb der anderen Komponente und übergeben zu müssen, ein Modell-Objekt als, ich würde empfehlen, mit den eckigen Kern OnInit-und Eingabe/Ausgabe-design-patterns.
Als Beispiel, dein code sollte eigentlich so Aussehen:
Einer Klasse, die ist im Grunde nur eine struct-Modell sollte nicht injiziert werden, da es bedeutet, können Sie nur einen einzigen gemeinsamen Instanzen dieser Klasse im Rahmen ist es vorgesehen war. In diesem Fall bedeutet, dass eine einzelne Instanz des Modells entsteht durch den dependency injector jedes mal testWidget instanziiert wird. Wenn es an der Modul-Ebene, Sie hätten nur eine einzige Instanz, die gemeinsam von allen Komponenten und services innerhalb des Moduls.
Stattdessen sollten Sie folgende standard Object-Oriented practices und erstellen ein eigenes Modell variable als Teil der Klasse, und wenn Sie benötigen, um Informationen in dieses Modell beim erstellen der Instanz, behandelt werden sollten, die von einem Dienst (injizierbaren), bereitgestellt durch das übergeordnete Modul. Dies ist, wie dependency injection und Kommunikation soll durchgeführt werden in eckige.
Auch, wie einige der anderen erwähnt, sollten Sie die Erklärung Ihrer model-Klassen in eine separate Datei und importieren Sie die Klasse.
Ich würde dringend empfehlen, geht zurück auf den kantigen Referenz-Dokumentation und die überprüfung des Grundlagen-Seiten auf die verschiedenen Anmerkungen und Klasse Typen:
https://angular.io/guide/architecture
Sollten Sie Ihre Aufmerksamkeit insbesondere auf die Abschnitte über Module, Komponenten und Dienstleistungen/Dependency Injection wie diese sind unerlässlich, um zu verstehen, wie zu verwenden Winkel auf einem architektonischen Niveau. Winkel ist ein sehr Architektur schwere Sprache, weil es so hohen Niveau. Die Trennung von Bedenken, dependency injection, Fabriken und javascript Versionskontrolle für browser Vergleichbarkeit sind hauptsächlich für Sie verarbeitet, aber Sie müssen verwenden Sie Ihre Anwendungsarchitektur richtig, oder du wirst Dinge finden, die nicht so funktionieren wie Sie es erwarten.
InformationsquelleAutor der Antwort user2904660