2017-01-20 3 views
1

Ich kann eine Angular-Komponente nicht rendern, und ich kann es nicht herausfinden.AUSNAHME: Uncaught (in Promise). Eingespritzter Service in Angular 2

Es ist etwas mit der Methode verbunden, die eine Dienste für das Injizieren von Daten aufruft. Es kehrt die error's Nachricht unter:

AUSNAHME: abgefangene (in Versprechen)

Das ist mein entsprechender Code:

cartelera-list.component.ts

import { Component, OnInit } from '@angular/core'; 

import { CarteleraService } from './cartelera.service'; 
import { Pelicula } from './pelicula.model'; 

@Component({ 
    selector: 'cartelera-list', 
    template: ` 
    <ul> 
    <li *ngFor="let pelicula of cartelera"> 
     <p>+++ {{ pelicula.titulo }} - {{ pelicula.genero }} - {{ pelicula.duracion }} </p> 
    </li> 
    </ul> 
    `, 
    providers: [CarteleraService] 
}) 

    export class CarteleraListComponent implements OnInit { 

    public cartelera: Pelicula[]; 

    contructor(private carteleraService: CarteleraService) {} 

    getPeliculas(): void { 
     this.carteleraService.getPeliculas().then((cartelera: Pelicula[]) => this.cartelera = cartelera); 
    } 

    ngOnInit(): void { 
     this.getPeliculas(); 
    } 

} 

carterera.service.ts

import { Injectable } from '@angular/core'; 

import { Pelicula } from './pelicula.model'; 
import { CARTELERA } from './pelicula-data'; 

@Injectable() 
export class CarteleraService { 
    getPeliculas(): Promise<Pelicula[]> { 
     return Promise.resolve(CARTELERA); 
    } 
} 

Der vom Service zurückgegebene Parameter CARTELERA ist nur eine const Verbindung durch eine Liste von Pelicula (Interface - Modell).

Hinweis: Der complet message's Fehler ist:

AUSNAHME: abgefangene (in Promise) Kann nicht Eigentum 'getPeliculas' undefinierter Fehler lesen.

Hinweis: Ich habe versucht, diesen Satz vor

contructor (privat carteleraService: CarteleraService) {}

Aber, wenn ich es benutzt, wird der nächste Fehler angezeigt, in der Kompilierung Zeit.

Error

app.module.ts

import { NgModule }  from '@angular/core'; 
import { BrowserModule } from '@angular/platform-browser'; 
import { FormsModule } from '@angular/forms'; 
import { AppComponent } from './app.component'; 

import { routing } from './app.routing'; 

import { SociosComponent } from './socios.component'; 
import { Index } from './index'; 
import { CarteleraComponent } from './cartelera.component'; 
import { CarteleraListComponent } from './cartelera-list.component'; 


@NgModule({ 
    imports:  [ 
    BrowserModule, 
    FormsModule, 
    routing  
    ], 
    declarations: [ 
    AppComponent, 
    SociosComponent, 
    Index, 
    CarteleraComponent, 
    CarteleraListComponent 
    ], 
    bootstrap: [ AppComponent ] 
}) 

export class AppModule {} 
+0

Bitte, überprüfen Sie mi zusätzliche Notiz. @echonax –

+0

Bitte, überprüfen Sie zusätzlich Hinweis. @ AJT_82 –

+0

Für den Teufel davon, "bieten" den Service von dem Modul, dass diese Komponente gehört (also "app" oder was auch immer sonst, wenn Sie ein Feature-Modul verwenden). Ansonsten mach alles gleich (mit der korrekten Konstruktorkonfiguration). Schau was passiert. Was eine Anwendungsarchitektur/-muster angeht, tendiere ich dazu, in Bezug auf die Bereitstellung von Modulen und das Konsumieren von Komponenten zu denken, und die Beispiele und so weiter scheinen dies zu bestätigen. Ich bin mir nicht sicher, ob ich jemals versucht habe, einen Dienst von einer Komponente "bereitzustellen", und ich bin mir nicht einmal sicher, ob eine Komponente sich selbst einen Dienst "anbieten" kann (oder sollte). –

Antwort

1

Echonax war fast richtig. Neben den Änderungen echonax Sie einen Tippfehler haben vorgeschlagen:

contructor(private carteleraService: CarteleraService) {} 

sollte constructor, so dass Sie s fehlten.

Als eine Nebenbemerkung, würde ich die providers: [CarteleraService] aus Ihrer Cartelera-Liste entfernen.Komponente, und es in Ihrem NgModule als Anbieter erklärt:

providers: [CarteleraService] 

, die den Dienst in der gesamten Modul macht, so dass Sie nicht importieren müssen und erklären es in allen Komponenten, die Sie benötigen. Nur ein Vorschlag! ;)

+1

Nun, was kann ich sagen? Bist du wieder @ AJT_82 !! ?? LOL, danke Mann ... :) :) :). Prost;) –

+1

Ich wieder, ja: D: D Gern geschehen! – Alex

1

ändern

private carteleraService: CarteleraService; 

contructor(carteleraService) {} 

mit

contructor(private carteleraService: CarteleraService) {} 

Auf diese Weise injiziert Angular DI CarteleraService zu Ihrem this.carteleraService

+0

Bitte, überprüfen Sie den Hinweis. –

+0

@EliasMP Haben Sie 'private carteleraService: CarteleraService;' aus Ihren Feldern entfernt? Es sollte nur im Konstruktor existieren. – echonax

+0

Yep ... Bearbeitete Post ... –

1

versuchen folgende Art und Weise unter Verwendung von manuell promise

@Injectable() 
export class CarteleraService { 
    getPeliculas(): Promise<Pelicula[]> { 

return new Promise((resolve, reject) => { 
    resolve(CARTELERA); 
    }); 
} 
} 

Sie sind nicht definiert, Versprechen in der richtigen Art und Weise zu schreiben. Versuchen Sie die Konsolenprotokollierung getPeliculas Methode in Service es selbst zu verifizieren

+0

Danke. Ich habe diesen Ansatz nicht versucht. Ich werde am Wochenende machen und Sie alle wissen lassen. Prost Kumpel :) :). Aber ich habe Probleme beim Versuch, die Service-Eigenschaft in der üblichen Weise zu definieren, wie @echonax auch sagte. Meine Lösung bestand darin, den Dienst in einer privaten Eigenschaft außerhalb des Konstruktors zu definieren. Ich frage mich, ob es richtig ist ... –

+0

Sie haben den Dienst im 'providers'-Array erwähnt + richtig importieren. Die Initialisierung im Konstruktor ist ebenfalls korrekt. Probieren Sie 'constructor (private carteleraService: CarteleraService) {console.log (this.carteleraService); } 'um zu überprüfen, welcher Dienst zurückkehrt. – candidJ

+0

Ja, sogar ich habe ein paar Arbeitsdemos auf diese Weise gemacht, aber jetzt verliere ich etwas. Und ich weiß nicht was. Ich kann das console.log auch nicht erreichen. Wenn ich tsc -p front starte, bekomme ich den Fehler ... –

Verwandte Themen