Я создаю службу Facebook, которая вызывает JavaScript javascript в Facebook, и мне интересно, как лучше всего реализовать обнаружение изменений, когда мои значения обновляются.
У меня есть UserService
, у которого есть свойство currentUser
, которое является объектом BehaviorSubject:
currentUser: Subject<User> = new BehaviorSubject<User>(new User(null));
И когда я хочу обновить пользователя в ответ на javascript sdk на facebook, сообщив мне, что пользователь вошел в систему или вышел из системы, я обновляю его и должен вызвать tick()
на ApplicationRef
:
updateUser(user: User) {
console.log('UserService.updateUser:', user);
this.currentUser.next(user);
this.appRef.tick(); // UI does not update without this
}
constructor(facebook: Facebook) {
this.facebook.facebookEvents.filter(x => x != null
&& x.eventName == 'auth.authResponseChange')
.subscribe((event) => {
this.updateUser(new User(event.data));
}
}
В моем компоненте я сохраняю "currentUser" из пользовательской службы в конструкторе и привязываюсь к свойству value:
<h2>Logged into Facebook as {{currentUser.value.name}}</h2>
<p>Is this you? <img src="{{currentUser.value.profilePicUrl}}"></p>
Я что-то делаю неправильно? Есть ли лучший способ, чем вызвать ApplicationRef.tick() после изменения, вызванного из внешней библиотеки?
Изменить
Я попытался использовать NgZone, и это не сработает, используя другое событие, которое возвращает сообщения в фиде в качестве служебных страниц через них:
constructor(userService: UserService, private ref: ApplicationRef, private zone: NgZone)
...
this.postsSubject.subscribe((post) => {
this.zone.runOutsideAngular(() => { // doesn't do anything
this.posts.push(post);
console.log('postsSubject POST, count is ', this.posts.length);
ref.tick(); // required to update bindings
});
}
Консоль показывает увеличение счетчика, но привязка html {{posts.length}}
обновляется только в том случае, если я добавляю вызов ref.tick()
...
Я думаю, что я где-то видел, что вы можете сделать доступными "входы" для любого компонента из компонента приложения верхнего уровня, который может быть способом для входа в систему пользователя, но не для других вызовов, таких как получение сообщений в фиде...