访问数组Angular2

时间:2017-06-12 13:43:24

标签: angular

当我尝试访问数组中的对象时遇到问题。这是我的代码:

import { Component, OnInit } from '@angular/core';
import {FirebaseService} from '../../services/firebase.service';
import { AngularFire, FirebaseListObservable, FirebaseObjectObservable } from 'angularfire2';
import {Router, ActivatedRoute, Params} from '@angular/router';
import * as firebase from 'firebase';
import { Observable } from 'rxjs';
import { FlashMessagesService } from 'angular2-flash-messages';

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

  listings:any;
  search:any;
  imageUrls: any = [];
  images:any;
  myimage:any;
  count:any;
  constructor(
    private firebaseService: FirebaseService,
    private router:Router,
    public af:AngularFire,
    private route:ActivatedRoute,    
    private flashMessage:FlashMessagesService) {

    this.firebaseService.getListings().subscribe(listings => {
      this.listings = listings;
      this.count = listings.length;
    });  
  }
  ngOnInit() {   

    this.firebaseService.getListings().subscribe(listings => { 


      this.listings = listings;
      for(var i = 0;i<this.listings.length;i++){
        this.getImageUrl(listings[i].$key);
      }

      console.log(this.imageUrls);
      console.log(this.imageUrls[1].ImageUrl);
    });  
  }
  searchProps(){    
    this.firebaseService.getListingsByTitle(this.search.toLowerCase()).subscribe(listings => { 
      this.listings = listings;
    });
  }

  getImageUrl(prodid){
    this.imageUrls = []; 
    this.firebaseService.getListingImages(prodid).subscribe(images => { 
      this.images = images[0];
      let image = images[0];
      let storageRef = firebase.storage().ref();
      let spaceRef = storageRef.child(image.path);
      storageRef.child(image.path).getDownloadURL().then((url) => {
        // Set image url
        this.imageUrls.push(new ImageUrl(image.$key,url));        
      }).catch((error) => {
        console.log(error);
      });        
      });
  }

}
export class ImageUrl {
  url: string;
  id:string;
  constructor(_id:string,_url: string) {
     this.url = _url
     this.id = _id;
  }
}

我的控制台日志显示此但我无法访问this.imageUrls [0]: enter image description here

我想访问this.imageUrls [0]并获取网址但是说“未定义”我不知道为什么我不能这样做。如果有人可以帮助我,我就这么堆积在这里。

编辑13/06/2017

在@JesúsPallares的帮助下,现在总是显示相同的图像。现在我想为每个列出图像。我在这里粘贴我的前端代码:

    <div class="col-md-4" *ngFor="let listing of listings  | orderby:'!$key'"  >
        <div class="card">
            <div class="card-image">
                <img class="img-responsive" [src]="imgSelected">

                <span class="card-title">{{listing.title}}</span>
            </div>

            <div class="card-content">
                <p>Cards for display in portfolio style material design by Google.</p>
            </div>

            <div class="card-action">
                <a [routerLink]="['/listing/'+listing.$key]">+ Info</a>
                <a [routerLink]="['/listing/'+listing.$key]">Contacto</a>
            </div>
        </div>
    </div>

1 个答案:

答案 0 :(得分:0)

你必须制作&#39; getImagUrl&#39;功能同步。例如,您可以使用主题:

来完成此操作
import {Subject} from 'rxjs';

imgSelected: any;

ngOnInit() {   
    this.firebaseService.getListings().subscribe(listings => { 
      this.listings = listings;
      for(var i = 0;i<this.listings.length;i++){
        this.getImageUrl(listings[i].$key).subscribe(isObtained => {
          if (isObtained) {
            this.imgSelected = this.imageUrls[0].url;
          }
        });
      }
    });
 }

getImageUrl(prodid): Subject<boolean> {
    let subject: Subject<boolean> = new Subject<boolean>();
    this.imageUrls = []; 
    this.firebaseService.getListingImages(prodid).subscribe(images => { 
      this.images = images[0];
      let image = images[0];
      let storageRef = firebase.storage().ref();
      let spaceRef = storageRef.child(image.path);
      storageRef.child(image.path).getDownloadURL().then((url) => {
        // Set image url
        this.imageUrls.push(new ImageUrl(image.$key,url));
        subject.next(true);
        subject.complete();
      }).catch((error) => {
        subject.next(false);
        subject.complete();
        console.log(error);
      });        
    });
    return subject;
}

一个图片标签:

<img class="img-responsive" [src]="imgSelected">

使用ngFor:

<img *ngFor="let img of imageUrls" class="img-responsive" [src]="img.url">

ngOnInit更新:

ngOnInit() {
    this.firebaseService.getListings().subscribe(listings => {
      let listingsLength = listings.length;
      let count: number = 0;
      let subject: Subject<any> = new Subject<any>();
      subject.subscribe(finish => {
        listings.forEach(list => {
          list.url = this.imageUrls.find(img => img.id === list.$key).url;
        });
        this.listings = listings;
      });
      for (let i = 0; i < listingsLength; i++) {
        count++;
        this.getImageUrl(listings[i].$key).subscribe(isObtained => {
          if (count === listingsLength) {
            subject.next('complete');
            subject.complete();
          }
        });
      }
    });
 }

HTML代码:

<div class="col-md-4" *ngFor="let listing of listings  | orderby:'!$key'"  >
    <div class="card">
        <div class="card-image">
            <img class="img-responsive" [src]="listing.url">

            <span class="card-title">{{listing.title}}</span>
        </div>

        <div class="card-content">
            <p>Cards for display in portfolio style material design by Google.</p>
        </div>

        <div class="card-action">
            <a [routerLink]="['/listing/'+listing.$key]">+ Info</a>
            <a [routerLink]="['/listing/'+listing.$key]">Contacto</a>
        </div>
    </div>
</div>