У меня есть модальное изображение профиля изменения, которое появляется, поэтому вы загружаете изображение, нажимаете сохранить, и что должно произойти, это то, что изображение профиля обновляется по всему сайту, но этого не происходит, только после того, как вы обновили изображение профиля, обновленное
моя функция сохранения при изменении профиля изображения в модале
save(): void {
const self = this;
this.saving = true;
self._profileService.updateProfilePicture(input)
.finally(() => { this.saving = false; })
.subscribe(() => {
const self = this;
self._$jcropApi.destroy();
self._$jcropApi = null;
abp.event.trigger('profilePictureChanged');
console.log('changed');
this._userService.updateProfilePicture();
self.close();
});
}
поэтому, когда пользователь нажимает сохранить, он загружает изображение, а затем вызывает функцию updateProfilePicture в моей пользовательской службе ...
мой пользовательский сервис настроен так ...
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Subject } from 'rxjs/subject';
@Injectable()
export class UserService {
private profilePictureSource = new Subject<any>();
profilePicture = this.profilePictureSource.asObservable();
updateProfilePicture() {
this.profilePictureSource.next();
}
}
затем в компоненте я хочу, чтобы изображение профиля изменилось
import { UserService } from '/userService';
import { ProfileService } from '/profileService';
export class ....
profilePicture: any;
constructor(
private _userService: UserService,
private _profileService: ProfileService
) { }
ngOnInit() {
// grab the profile picture on init
this.userPic();
// Listen for profile picture change
this._userService.profilePicture.subscribe(result => {
this.userPic();
}
}
userPic() {
this._profileService.getProfilePicture().subscribe(result => {
if (result && result.profilePicture) {
this.profilePicture = 'data:image/jpeg;base64,' + result.profilePicture;
}
});
}
тогда в моем HTML
<img [src]="profilePicture" />
Я пытался закомментировать self.close();
только в том случае, если это вызывало проблему, как будто она закрывалась до того, как было получено изменение для вызова службы, но это ничего не изменило
EDIT
Когда я использую отладчик Chrome, я ставлю точки останова на все функции и вызов службы ... когда я нажимаю сохранить, функция userService вызывает точку останова ... но после этого никакие другие функции в стеке не вызываются. Я не знаю почему?
2-е РЕДАКТИРОВАНИЕ
Я последовал за ответом Абылая Куракбаева и изменил
profilePicture = this.profilePictureSource.asObservable(); //from
profilePicture = this.profilePictureSource; //to
но это не решило проблему
РЕДАКТИРОВАТЬ 3
вот функция getProfilePicture ()
getProfilePicture(): Observable<GetProfilePictureOutput> {
let url_ = this.baseUrl + "/api/services/app/Profile/GetProfilePicture";
url_ = url_.replace(/[?&]$/, "");
let options_ : any = {
method: "get",
headers: new Headers({
"Content-Type": "application/json",
"Accept": "application/json"
})
};
return this.http.request(url_, options_).flatMap((response_ : any) => {
return this.processGetProfilePicture(response_);
}).catch((response_: any) => {
if (response_ instanceof Response) {
try {
return this.processGetProfilePicture(response_);
} catch (e) {
return <Observable<GetProfilePictureOutput>><any>Observable.throw(e);
}
} else
return <Observable<GetProfilePictureOutput>><any>Observable.throw(response_);
});
}
РЕДАКТИРОВАТЬ 4
Это метод processGetProfilePicture ()
protected processGetProfilePicture(response: Response): Observable<GetProfilePictureOutput> {
const status = response.status;
let _headers: any = response.headers ? response.headers.toJSON() : {};
if (status === 200) {
const _responseText = response.text();
let result200: any = null;
let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
result200 = resultData200 ? GetProfilePictureOutput.fromJS(resultData200) : new GetProfilePictureOutput();
return Observable.of(result200);
} else if (status !== 200 && status !== 204) {
const _responseText = response.text();
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
}
return Observable.of<GetProfilePictureOutput>(<any>null);
}
РЕДАКТИРОВАТЬ 5
Мне интересно, есть ли способ принудительно обновить компонент, в котором находится функция userPic()
?? Поскольку изображение профиля обновляется, как только вы обновляете страницу ??
Спасибо