【问题标题】:ngFor looping isnt workingngFor 循环不起作用
【发布时间】:2017-09-04 08:56:31
【问题描述】:

我正在尝试使用 Yahoo Finance 来查找股票的名称和价格。 尝试使用 ngFor 循环遍历结果。我无法在 html 文件中显示结果。结果成功显示在控制台上。我认为服务文件工作正常。

Github:https://github.com/Manasipotade/stock-app 用于显示结果的文件

.ts 文件

import { Component, OnInit, Input } from '@angular/core';
import { StockService } from 'app/stock.service';
import {Observable, BehaviorSubject } from 'rxjs';

@Component({
 selector: 'stock-app',
 templateUrl: './stock-app.component.html',
 styleUrls: ['./stock-app.component.scss']
})
export class StockAppComponent implements OnInit {
  stocks$: Observable<any>;
    stockSymbol: string;  
    constructor(
            private _stockService: StockService
      ) { }
    ngOnInit() {
        this.stocks$ = this._stockService.stocks$;
      }
  }

html文件

<div class="container-fluid">
<div class="row">
  <div class="col-4">
    <stock-input></stock-input>
  </div>
  <div class="col-8">
      <table class="table table-stripped">
          <thead>
            <tr>
              <th>Name</th>
              <th>Price</th>
            </tr>
          </thead>
          <tbody>
            <tr *ngFor="let stock of stocks$ | async">
              <td>
                {{ stock | json }}
              </td>
            </tr>
          </tbody>
        </table>
  </div>

库存服务

import { Injectable } from '@angular/core';
import { Http, Headers, Response } from '@angular/http';
import 'rxjs/add/operator/map'; 
import {Observable, BehaviorSubject } from 'rxjs';
@Injectable()
export class StockService {
  private _stocks$: BehaviorSubject<any> = new BehaviorSubject<any>([]);            

  public readonly stocks$ = this._stocks$.asObservable();
    constructor(
      private _http: Http
    ) { }

    getStock(stockSymbol:string):Observable<any []>{
    let searchQuery ='select * from yahoo.finance.quotes where symbol={$stockSymbol} ';
    const stocklookupUrl:string='http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20%3D%20%27'+stockSymbol+'%27&format=json&diagnostics=true&env=store://datatables.org/alltableswithkeys&callback=';
    let headers = new Headers();
    headers.append('Content-Type','application/json');
    return this._http.get(stocklookupUrl).map((res:Response) =>{
    this._stocks$.next([...this._stocks$.value,res.json]);
    console.log(this._stocks$.value);
    return res.json();
    })
      }

}

【问题讨论】:

  • 你能发StockService代码吗?
  • 你能控制服务响应还是变量:stocks$?
  • 已发布 StockService 文件
  • 你试过subscribe块吗?

标签: html angular angular-cli yql ngfor


【解决方案1】:

由于您想使用 for 循环显示名称和价格,我假设您的服务响应应该是对象数组,其中每个对象代表一只股票,并以名称和价格作为其键。如果是这样,您的代码不正确。应该是:

      <tbody>
        <tr *ngFor="let stock of stocks$ | async">
          <td>
            {{ stock.name }}
          </td>
          <td>
            {{ stock.price }}
          </td>
        </tr>
      </tbody>

【讨论】:

  • 这不起作用。它尝试使用 stock.query.results.quote.Ask 但没有。
  • 您在哪里调用了服务的 getStock 方法?你能安慰和分享你在 ngOnInit 钩子中从 stock$ 中得到的东西吗?
  • getStock 在输入组件中被调用。从服务函数返回数据。 ngOnInit 中的 stock$ 返回类似 [object Object] 的内容。
  • 在做console.log时,做console.log(JSON.stringify(your_var_name))。然后你将在控制台中获取内容。
  • 返回 {"_isScalar":false,"source":{"_isScalar":false,"observers":[],"closed":false,"isStopped":false,"hasError": false,"thrownError":null,"_value":[]}}
【解决方案2】:

由于 JS 是异步的,你不能在 HTML dom 中请求和分配 http 响应值,因为 html 在收到响应之前不会保持渲染。 我建议您可以从主要组件调用 http 请求并将响应存储在 Service Variable 中。并从您的子组件访问该特定变量。 并且当您需要更新服务变量时,您可以通过触发请求进行刷新。

import { Component, OnInit, Input } from '@angular/core';
import { StockService } from 'app/stock.service';
import {Observable, BehaviorSubject } from 'rxjs';

@Component({
   selector: 'stock-app',
   templateUrl: './stock-app.component.html',
   styleUrls: ['./stock-app.component.scss']
})
export class StockAppComponent implements OnInit {
stocks$: Observable<any>;
stockSymbol: string;  
constructor(
        private _stockService: StockService
  ) { }
ngOnInit() {
    this.stocks$ = this._stockService.stockObj; // get updated response from service object
  }
}

和服务

import { Injectable } from '@angular/core';
import { Http, Headers, Response } from '@angular/http';
import 'rxjs/add/operator/map'; 
import {Observable, BehaviorSubject } from 'rxjs';
@Injectable()
export class StockService {
    stockObj : any;
    private _stocks$: BehaviorSubject<any> = new BehaviorSubject<any>([]);            

    public readonly stocks$ = this._stocks$.asObservable();
   constructor(
     private _http: Http
   ) { }

 getStock(stockSymbol:string):Observable<any []>{
 let searchQuery ='select * from yahoo.finance.quotes where symbol={$stockSymbol} ';
 const stocklookupUrl:string='http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20%3D%20%27'+stockSymbol+'%27&format=json&diagnostics=true&env=store://datatables.org/alltableswithkeys&callback=';
let headers = new Headers();
headers.append('Content-Type','application/json');
return this._http.get(stocklookupUrl).map((res:Response) =>{
    this._stocks$.next([...this._stocks$.value,res.json]);
    console.log(this._stocks$.value);
    this.stockObj = this._stocks$.value; // Assign response to variable stockObj
    return res.json();
})
  }

【讨论】:

  • 没有。干活。我怀疑html是否不会遍历结果
  • 你打电话给 this.stocks$ = this._stockService.stocks$;从你的根组件?如果不是你打电话的地方?
【解决方案3】:

StockAppComponent

import { Component, OnInit, Input } from '@angular/core';
import { StockService } from 'app/stock.service';
import { Observable, BehaviorSubject } from 'rxjs';

@Component({
  selector: 'stock-app',
  templateUrl: './stock-app.component.html',
  styleUrls: ['./stock-app.component.scss']
})
export class StockAppComponent implements OnInit {

  stocks$: Observable<any>;
  stockSymbol: string;

  constructor(
    private _stockService: StockService
  ) { }

  ngOnInit() {

    this._stockService.getStock(this.stockSymbol).subscribe((response: any) => {

      this.stocks$ = response;
    }, (error: any) => {

      console.log(JSON.stringify(error));
    });
  }
}

【讨论】:

    猜你喜欢
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 2012-03-30
    • 2011-10-19
    相关资源
    最近更新 更多