【问题标题】:Property 'subscribe' does not exist on type 'void'. Angular 2 asp.net core“void”类型上不存在属性“subscribe”。 Angular 2 asp.net 核心
【发布时间】:2016-06-23 11:58:51
【问题描述】:

当我尝试使用订阅时出现以下错误。我对 .map 也有同样的问题,但我通过替换以下文件 https://raw.githubusercontent.com/Microsoft/TypeScript/Fix8518/lib/typescriptServices.js

解决了这个问题

我已将 Typescript 更新为 1.8.6,并将 Visual Studio 2015 更新为更新 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"

}
}

【问题讨论】:

    标签: javascript angular typescript


    【解决方案1】:

    您忘记返回您的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;。在构造函数参数前面写publicprivate 已经将其添加为类成员。

    【讨论】:

    • 哇,原来是这样 :D 非常感谢,真不敢相信我忘记了这个 xD
    • 好答案。在这里使用 Angular 2+ 和 observables,不要忘记你的 return 关键字或隐式返回!或者 .subscribe() 会恨你
    【解决方案2】:

    你的 get()-Function 不返回 Observable -> 没有订阅。 试试:

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

    【讨论】:

    • 这实际上不起作用,因为在使用带有 lambda 的花括号时,您需要显式返回一个值。
    猜你喜欢
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    相关资源
    最近更新 更多