繁体   English   中英

Angular2:类型'订阅'不能分配给类型

[英]Angular2 : Type 'Subscription' is not assignable to type

我创建了一个非常小的应用程序来从json文件中获取国家/地区并将其绑定到下拉列表。

countries.json

export class Country {
    id: number;
    name: string;
}

factory.service.ts

import { Injectable } from '@angular/core';
import { Http, Response} from '@angular/http';
import { Observable } from 'rxjs/Observable';

import { Country } from './shared/country';

@Injectable()
export class FactoryService {
    private countryUrl = "app/data/countries.json";

    constructor(private http: Http) {

    }

    getCountry(): Observable<any> {
        return this.http.get(this.countryUrl)
            .map(this.extractData)
            .do(data => console.log("get Countries from json: " + JSON.stringify(data)))
            .catch(this.handleError);
    }

    private extractData(response: Response) {
        let body = response.json();
        return body || {};
    }

    private handleError(error: Response) {
        console.log(error);
        return Observable.throw(error.json().error || "500 internal server error");
    }
}

工厂form.component.ts

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

import { Factory } from './factory';
import { Country } from './shared/country';
import { FactoryService } from './factory.service';

@Component({
    moduleId: module.id,
    selector: 'factory-form',
    templateUrl: './factory-form.component.html',
    styleUrls: ['./factory-form.component.css'],
    providers: [FactoryService]
})
export class FactoryFormComponent implements OnInit{

    private model: Factory;
    countries: Country[];
    factoryStatuses;
    productTypes;
    risks;
    private errorMessage: string;
    private submitted = false;

    constructor(private factoryService: FactoryService) {

    }

    ngOnInit(): void {
        this.countries = this.factoryService.getCountry()
            .subscribe(countries => this.countries = countries,
            error => this.errorMessage = error);
    }

    onSubmit(): void {
        this.submitted = true;
    }}

factory-form.component.html代码段

<div class="col-lg-3">
            <select class="form-control" name="Country">
                <option *ngFor="let country of countries" [value]="country.id">{{country.name}}</option>
            </select>
        </div>

我收到运行时错误如下:

错误:Typescript发现以下错误:
C:/Projects/ethical_resourcing/src/Ethos.Client/tmp/broccoli_type_script_compiler-input_base_path-kviWq7F3.tmp/0/src/app/factory/factory-form.component.ts(30,9):类型'订阅'不是可分配给'Country []'类型。
“订阅”类型中缺少“属性'长度'。
C:/Projects/ethical_resourcing/src/Ethos.Client/tmp/broccoli_type_script_compiler-input_base_path-kviWq7F3.tmp/0/src/app/factory/shared/country.ts(2,15):';' 预期。 在BroccoliTypeScriptCompiler._doIncrementalBuild(C:\\ Projects \\ ethical_resourcing \\ src \\ Ethos.Client \\ node_modules \\ angular-cli \\ lib \\ broccoli \\ broccoli-typescript.js:120:19)中的BroccoliTypeScriptCompiler.build(C:\\ Projects \\ ethical_resourcing \\ src \\ Ethos.Client \\ node_modules \\ angular-cli \\ lib \\ broccoli \\ broccoli-typescript.js:43:10)在C:\\ Projects \\ ethical_resourcing \\ src \\ Ethos.Client \\ node_modules \\ angular-cli \\ node_modules \\ broccoli-在lib $ rsvp $$ internal $$ tryCatch(C:\\ Projects \\ ethical_resourcing \\ src \\ Ethos.Client \\ node_modules \\ angular-cli \\ node_modules \\ rsvp \\ dist \\ rsvp.js)中的caching-writer \\ index.js:152:21 :1036:16)在lib $ rsvp $$ internal $$ invokeCallback(C:\\ Projects \\ ethical_resourcing \\ src \\ Ethos.Client \\ node_modules \\ angular-cli \\ node_modules \\ rsvp \\ dist \\ rsvp.js:1048:17)at at lib $ rsvp $ asv $ lib $ rsvp $$ internal $$ publish(C:\\ Projects \\ ethical_resourcing \\ src \\ Ethos.Client \\ node_modules \\ angular-cli \\ node_modules \\ rsvp \\ dist \\ rsvp.js:1019:11) $ flush(C:\\ Projects \\ ethical_resourcing \\ src \\ Ethos.Client \\ node_modules \\ angular-cli \\ node_modu les \\ rsvp \\ dist \\ rsvp.js:1198:9)在process._tickCallback(node.js:349:13)的nextTickCallbackWith0Args(node.js:420:9)

现在,如果我将Observable的类型和国家更改为任何,那么我会得到以下错误

原始例外:找不到'object'类型的不同支持对象'[object Object]'。 NgFor仅支持绑定到诸如Arrays之类的Iterables。

是的,类型必须是Observable ,并且您需要使用异步管道来使ngFor happy:

*ngFor="let country of countries | async"

或者另一种选择是保持Country[]类型,然后订阅并将countries Country[]分配给数组:

this.factoryService.getCountry() // note, removed this.countries = 
    .subscribe(
        countries => this.countries = countries,
        error => this.errorMessage = error
    );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM