2016-12-09 4 views
2

Я пытаюсь отобразить изображение в * ngFor, которое я загрузил из Firebase Storage.Как я могу получить изображение из хранилища Firebase и отображать их в Angular 2 ngFor

Мне удалось получить данные изображения из хранилища, но я не знаю, как установить данные изображения в инструкции ngFor.

Позвольте мне показать вам мой код здесь.

<ons-list-item class="list__item list__item--chevron" tappable *ngFor="let request of requests | async" (click)="pushToDetail(request)"> 
    <ons-row> 
     <ons-col width="20%"><img [src]="userProfileImg"></ons-col> 
     <ons-col style="padding-left:20px;"> 
     <p class="name"><i class="fa fa-venus fa-fw" aria hidden="true"></i>{{request.nickName}}</p> 
     </ons-col> 
    </ons-row> 
</ons-list-item> 

И это код для загрузки изображения. Я написал это в foreach, когда я подписал данные FirebaseListObservable.

getProfileImageUrl(userId: string) { 
    const userStorageRef = firebase.storage().ref().child('images/users/' + userId + "_users.jpg"); 
    userStorageRef.getDownloadURL().then(url => { 
     this.userProfileImg = url 
    }); 
    } 

Тогда я хотел бы, чтобы вы научили меня грамотным изображениям из хранилища Firebase. Какие-либо предложения?

+0

Является ли изображение уникальным для каждого элемента массива, который вы итерируете? Из приведенного выше кода кажется, что вы показываете одно и то же изображение для всех строк. – borislemke

ответ

1

Предполагая, что изображение является уникальным для каждого элемента массива:

<ons-list-item class="list__item list__item--chevron" tappable *ngFor="let request of requests | async" (click)="pushToDetail(request)"> 
    <ons-row> 
     <ons-col width="20%"><img [src]="userProfileImg"></ons-col> 
     <ons-col style="padding-left:20px;"> 
     <p class="name"><i class="fa fa-venus fa-fw" aria hidden="true"></i>{{request.nickName}}</p> 
     </ons-col> 
    </ons-row> 
</ons-list-item> 

Вы должны изменить [src]="userProfileImg" на функцию, которая возвращает URL для каждого изображения в элементе массива [src]="getUserProfileImage(request)" например.

И в компоненте:

... 
getUserProfileImage(request: TypeOfRequestHere) { 
    return 'images/users/' + request.userId + '_users.jpg'; 
} 
... 

Update Кроме того, это может быть сделано в шаблоне:

[src]="'images/users/' + request.userId + '_users.jpg'" 
+0

Спасибо за помощь, это работает! – taku845

+0

@taku рад быть полезным! – borislemke

+0

@taku рассмотреть вопрос о выборе моего ответа как «Принято», если он действительно работает, чтобы другие могли видеть. Благодаря! – borislemke

2

Сохранить название картины, и короткий путь к базе данных.

Используйте следующий код для загрузки изображения base64;

uploadImage(name, data) { 
    let promise = new Promise((res,rej) => { 
     let fileName = name + ".jpg"; 
     let uploadTask = firebase.storage().ref(`/posts/${fileName}`).put(data); 
     uploadTask.on('state_changed', function(snapshot) { 
     }, function(error) { 
      rej(error); 
     }, function() { 
     var downloadURL = uploadTask.snapshot.downloadURL; 
      res(downloadURL); 
     }); 
    }); 
    return promise; 
} 

Это всего лишь 2 строки кода, чтобы получить реальный url с разрешениями.

this.storageRef = firebase.storage().ref().child('images/image.png'); 
this.storageRef.getDownloadURL().then(url => console.log(url)); 

Если вам нужно больше optons как прохождение строк, адреса URI и т.д., вы можете проверку my blog post about uploading, and getting data from firebase storage using angularfire2.

Я надеюсь, что это помогает кому-то.