Javascript 管道“AsyncPipe”的无效参数

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/35881721/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 18:19:39  来源:igfitidea点击:

Invalid argument for pipe 'AsyncPipe'

javascripttypescriptfirebaseangular

提问by Petros Kyriakou

So i get this when i try to get my data from firebase

所以当我尝试从 firebase 获取我的数据时我得到了这个

Invalid argument '{"-KCO4lKzEJPRq0QgkfHO":{"description":"teste","id":1457488598401,"resourceUrl":"tete","title":"test2"}}' for pipe 'AsyncPipe' in [listItems | async  in ArcListComponent@2:10]

ArcListComponent

ArcList组件

import { Component, OnInit } from "angular2/core";
import { FirebaseService } from "../shared/firebase.service";
import { ArcItem } from "./arc-item.model";


@Component({
    selector: "arc-list",
    template: `
    <ul class="arc-list">
      <li *ngFor="#item of listItems | async " class="arc-item">
        <h3>{{ item.name}}</h3><a [href]="item.resourceUrl" target="_blank" class="btn btn-success pull-right"><span>Go</span></a>
        <hr>
        <blockquote>{{ item.description }}</blockquote>
        <hr>

      </li>
    </ul>
    `

})

export class ArcListComponent implements OnInit {
  listItems: string;

  constructor(private _firebaseService: FirebaseService) {}

  ngOnInit(): any {
    this._firebaseService.getResources().subscribe(
      resource => this.listItems = JSON.stringify(resource),
      error => console.log(error)
    );
  }

}

firebase_service

firebase_service

import { Injectable } from "angular2/core";
import { Http } from "angular2/http";
import "rxjs/Rx";

@Injectable()
export class FirebaseService {

  constructor(private _http: Http) {}

  setResource(id: number, title: string, description: string, resourceUrl: string) {
    const body = JSON.stringify({ id: id, title: title, description: description, resourceUrl: resourceUrl});

    return this._http
                     .post("https://######.firebaseio.com/resource.json", body)
                     .map(response => response.json());
  }

  getResources() {
    return this._http
                     .get("https://######.firebaseio.com/resource.json")
                     .map(response => response.json());
  }
}

I know i am trying to show my data the wrong way but i do not know how to fix this. any help appreciated.

我知道我试图以错误的方式显示我的数据,但我不知道如何解决这个问题。任何帮助表示赞赏。

回答by Thierry Templier

The asyncpipe expects an observable or a promise. http.getand mapoperator return observable, so you can set the returned object into the listItemsproperty of your component. You don't need to subscribe in this case:

async管道预计可观察或承诺。http.getand mapoperator return observable,因此您可以将返回的对象设置为listItems组件的属性。在这种情况下,您不需要订阅:

this.listItems = this._firebaseService.getResources();

Moreover the object, this element will "receive" must be an array to be able to use it within an ngFor. You service returns an object and not an array from Firebase. If you want to iterate over the keys of the object, you need to implement a custom pipe:

此外,该元素将“接收”的对象必须是一个数组才能在ngFor. 您的服务从 Firebase 返回一个对象而不是数组。如果要遍历对象的键,则需要实现自定义管道:

@Pipe({name: 'keys'})
export class KeysPipe implements PipeTransform {
  transform(value, args:string[]) : any {
    let keys = [];
    for (let key in value) {
      keys.push({key: key, value: value[key]);
    }
    return keys;
  }
}

and use it like this:

并像这样使用它:

@Component({
  selector: "arc-list",
  template: `
  <ul class="arc-list">
    <li *ngFor="#item of listItems | async | keys" class="arc-item">
      <h3>{{ item.value.name}}</h3><a [href]="item.value.resourceUrl" target="_blank" class="btn btn-success pull-right"><span>Go</span></a>
      <hr>
      <blockquote>{{ item.value.description }}</blockquote>
      <hr>

    </li>
  </ul>
  `,
  pipes: [ KeysPipe ]
})

See this question for more details:

有关更多详细信息,请参阅此问题:

回答by Sasxa

asyncpipe works with observables and/or promises. It does subscription for you, so you just have to pass an observable without subscribing to it in your code:

asyncpipe 与 observables 和/或 promises 一起工作。它为你订阅,所以你只需要传递一个 observable 而不用在你的代码中订阅它:

  ngOnInit(): any {
    this.listItems = this._firebaseService.getResources()
  }