ค้นหาเว็บไซต์

javascript - คุณสมบัติ 'subscribe' ไม่มีอยู่ในประเภท 'void'. Angular 2 asp.net core


ฉันได้รับข้อผิดพลาดดังต่อไปนี้เมื่อพยายามใช้ subscribe ฉันมีปัญหาเดียวกันกับ .map แต่ฉันแก้ไขได้โดยการแทนที่ไฟล์ต่อไปนี้ https://raw.githubusercontent.com/Microsoft/TypeScript/Fix8518/lib/typescriptServices.js

ฉันได้อัปเดต Typescript เป็นเวอร์ชัน 1.8.6 และอัปเดต Visual Studio 2015 เป็น Update 3 แล้ว

ฉันไม่มีความคิดเลยว่าจะแก้ไขปัญหานี้อย่างไรหรือว่าฉันทำอะไรผิดไปบ้าง ฉันก็ได้เพิ่มเข้าไปด้วย

import 'rxjs/Rx'; 

ไปที่คลาส bootstrap และ app.component แล้วยังคงเกิดข้อผิดพลาดเหมือนเดิม

รหัสบริการ:

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

คลาสที่ใช้บริการ:

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

ไฟล์ 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"

}
}

คำตอบ #1

คุณลืมใส่ return ใน get() ของคุณ นอกจากนี้อย่าครอบร่างของฟังก์ชัน lambda โดยไม่คืนค่าอะไร มีการคืนค่าโดยปริยายเกิดขึ้นถ้าคุณทำแค่ response => response.json() มิฉะนั้นคุณต้องเขียนแบบนี้: response => { return response.json(); }.

นี่คือเวอร์ชันที่ปรับปรุงแล้วของวิธีของคุณ:

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

นอกจากนี้เพียงแค่ละเว้น this.http=http; ในตัวสร้างของคุณ การเขียน public หรือ private นำหน้าพารามิเตอร์ของตัวสร้างก็จะเพิ่มมันเป็นสมาชิกของคลาสแล้ว

บทความที่เกี่ยวข้อง