2016-06-23 12 views
7

Viene visualizzato il seguente errore quando si tenta di utilizzare subscribe. Ho avuto lo stesso problema con il MAP, ma ho risolto questo con la sostituzione del seguente file https://raw.githubusercontent.com/Microsoft/TypeScript/Fix8518/lib/typescriptServices.jsLa proprietà 'subscribe' non esiste sul tipo 'void'. Angular 2 asp.net core

Ho aggiornato tipografico a 1.8.6 e aggiornato Visual Studio 2015 per aggiornare 3.

non ho idea di come per risolvere questo problema o se sto facendo qualcosa di sbagliato, ho anche aggiunto

import 'rxjs/Rx'; 

al bootstrap e classi app.component ed ancora lo stesso errore.

codice di servizio:

import { Injectable } from 'angular2/core'; 
import {Http, URLSearchParams} from "angular2/http"; 
import 'rxjs/add/operator/map'; 

@Injectable() 
export class MediaItemService { 

constructor(public http: Http) { 
    this.http = http; 
} 

//functions 
get() { 
    // return this.mediaItems; 
    this.http.get("/api/MediaItem").map(response => { response.json() }); 
} 
} 

classe in cui viene utilizzato il servizio:

import {Component, Inject} from 'angular2/core'; 
import 'rxjs/Rx'; 
import {MediaItemComponent} from './media-item.component'; 
import {CategoryListPipe} from './category-list.pipe'; 
import {MediaItemService} from './media-item.service'; 

@Component({ 
selector: 'media-item-list', 
directives: [MediaItemComponent], 
pipes: [CategoryListPipe], 
providers: [MediaItemService], 
templateUrl: 'app/media-item-list.component.html', 
styleUrls: ['app/media-item-list.component.css'] 
}) 
export class MediaItemListComponent { 


constructor(private mediaItemService: MediaItemService) { 

     //.subscribe(mediaItems => { 
     // this.mediaItems = mediaItems; 
     //}); 
} 

ngOnInit() { 
    this.mediaItems = this.mediaItemService.get().subscribe(mediaItems => { 
      this.mediaItems = mediaItems; 
     }); 
} 

onMediaItemDeleted(mediaItem) { 

    this.mediaItemService.delete(mediaItem); 
} 

mediaItems; 
} 

file di package.json:

{ 
"version": "1.0.0", 
"name": "TestFunWithAngi", 
"private": true, 
"dependencies": { 
"angular2": "^2.0.0-beta.17", 
"systemjs": "^0.19.31", 
"es6-promise": "^3.2.1", 
"es6-shim": "^0.35.1", 
"reflect-metadata": "^0.1.3", 
"rxjs": "^5.0.0-beta.9", 
"tsd": "^0.6.5", 
"zone.js": "^0.6.12" 
}, 
"devDependencies": { 
"typescript": "^1.8.10", 
"typings": "^0.8.1", 
"grunt": "1.0.1", 
"grunt-contrib-copy": "1.0.0", 
"grunt-contrib-uglify": "1.0.1", 
"grunt-contrib-watch": "1.0.0", 
"grunt-ts": "5.5.1" 

} 
} 

risposta

25

Hai dimenticato di tornare nella vostra get(). Inoltre non incapsulare il corpo delle funzioni lambda senza restituire qualcosa. Un ritorno implicito sta accadendo se si fa semplicemente response => response.json(). Altrimenti devi scrivere così: response => { return response.json(); }.

Ecco una versione migliorata del metodo:

get() { 
    // return this.mediaItems; 
    return this.http.get("/api/MediaItem").map(response => response.json()); 
} 

anche semplicemente lasciare il this.http = http; nel costruttore. Scrivere public o private davanti all'argomento del costruttore lo aggiunge già come membro della classe.

+0

wow è stato effettivamente così: D grazie mille, non posso credere di aver dimenticato questa xD – user5049376

+1

buona risposta. utilizzando Angular 2+ e osservabili qui, non dimenticare le parole chiave di ritorno o i ritorni impliciti! o .subscribe() ti odierà – russiansummer

0

tuo get() - funzione non restituisce il osservabile -> niente da iscrivere. Prova:

get() { 
    return this.http.get("/api/MediaItem").map(response => { response.json() }); 
} 
+0

grazie mille per aver notato questo errore: D +1 – user5049376

+0

Questo in realtà non funziona, dal momento che è necessario restituire esplicitamente un valore, quando si utilizzano parentesi graffe con lambda. – rinukkusu