web-dev-qa-db-fra.com

La propriété 'subscribe' n'existe pas sur le type 'void'. Angular 2 asp.net core

J'obtiens l'erreur suivante lorsque j'essaie d'utiliser Subscribe. J'avais le même problème avec .map, mais je l'ai résolu en remplaçant le fichier suivant https://raw.githubusercontent.com/Microsoft/TypeScript/Fix8518/lib/typescriptServices.js

J'ai mis à jour TypeScript vers 1.8.6 et Visual Studio 2015 pour mettre à jour 3.

Je ne sais pas comment résoudre ce problème ou si je fais quelque chose de mal, j'ai aussi ajouté 

import 'rxjs/Rx'; 

aux classes bootstrap et app.component et toujours la même erreur.

code de service:

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 où le service est utilisé:

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; 
}

fichier 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"

}
}
15
user5049376

Vous avez oublié de revenir dans votre get(). Aussi, n'encapsulez pas le corps des fonctions lambda sans renvoyer quelque chose. Un retour implicite se produit si vous ne faites que response => response.json(). Sinon, vous devez l'écrire comme ceci: response => { return response.json(); }.

Voici une version améliorée de votre méthode:

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

Aussi, laissez simplement le this.http = http; dans votre constructeur. Écrire public ou private devant l'argument constructeur l'a déjà ajouté en tant que membre de la classe.

39
rinukkusu

Votre fonction get () - ne renvoie pas l'observable -> rien à vous inscrire . Essayez:

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