如何访问组件中的服务获取的对象?

时间:2016-11-18 14:57:57

标签: angular service typeerror

当我尝试使用searchAtoms中的'this.atoms'访问原子时,它返回“TypeError:无法读取未定义的属性'长度'”。我在想原子是因为* ngFor运作良好。订阅背后有一些隐藏的逻辑?如果有人知道这件事,你能提供一些线索吗?而且,另一个问题是,当我使用参数定义getAtoms方法时,原子名称值来自atom.service.ts中的输入字段,如this.service.getAtoms(newAtom)。但我得到“参数proerty只允许在构造函数实现中”。我想我不能用这种方式。你有没有人可以为此推荐一种理想的方式?

app.component.ts

import {Component} from 'angular2/core';
import {Router} from 'angular2/router';
import {AtomService} from './service/atom.service';
import {Atom} from './datatype/Atom';

@Component({
    selector: 'my-app',
    template: `<br>
    <input #atomname value='atom1'>
    <button (click)=searchAtoms(atomname.value)>Search Atoms</button>  
    <br><br>
    <ul>
        <li *ngFor="#atom of atoms">
            {{atom.id}} - {{atom.name}}
        </li>
    </ul>`,
    providers: [ConceptService]
})


export class AppComponent {

    atoms: Array<Atom>;

    constructor(private service : AtomService) {

    }

    searchAtoms(newAtom: string) {
        console.log("searchAtoms\t" + newAtom);
        if (newAtom) {
            this.service.getAtoms(newAtom).subscribe(data => this.atoms = data);
            console.log(this.atoms.length);
        }
    }
}

atom.service.ts

import { Injectable }     from 'angular2/core';
import { Http, Response, URLSearchParams, Headers } from 'angular2/http';
import 'rxjs/add/operator/map';
import {Atom} from '../datatype/Atom';

@Injectable()
export class ConceptService {

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

  getAtoms(private newAtom: string) {
    return this.http.get('api/atoms.js')
    .map( (responseData) => {return responseData.json()})
    .map( data => {
        let results:Array<Atom> = [];
        for (var i = 0; i < data.result.length; i++) {
            results.push(new Atom(data.result[i].id, data.result[i].name));
        }
        return results;
    });
  }
}

1 个答案:

答案 0 :(得分:2)

Http服务返回Observable,您订阅了它。这是一个异步操作,但您尝试在数据从服务器到达之前访问它。如果您移动console.log内部subscribe回调,它将会有效。

this.service.getAtoms(newAtom).subscribe(data => {
  this.atoms = data;
  console.log(this.atoms.length);
});

对于第二个问题,您只需要删除private关键字。

getAtoms(newAtom: string) { }