Am I doing something wrong? Is there a better way than having to call ApplicationRef.tick()
after a change triggered from an external library?
It depends. If you're calling the Facebook APIs outside of Angular (i.e., registering asynchronous event handlers outside Angular), then you'll need to manually run change detection as part of handling any events. You can either
- inject
NgZone
and then call run()
on that object, which will execute the passed (callback) function inside the Angular zone and then automatically call ApplicationRef().tick()
, which will run change detection for the entire app, or
- inject
ApplicationRef
and call tick()
yourself, or
- inject
ChangeDetectorRef
and call detectChanges()
yourself -- this will only run change detection on the one component and its children
Note, if you inject NgZone
, you don't want to use runOutsideAngular()
. That will execute the passed (callback) function outside the Angular zone, and it will not call ApplicationRef().tick()
, so change detection will not execute.
If you call the Facebook APIs inside Angular, you might be able to avoid all of the above, because then Angular (via its use of Zone.js) should monkey-patch the asynchronous event calls. Then, when your events fire, ApplicationRef.tick()
will automatically be called. See https://stackoverflow.com/a/34593821/215945 for more discussion on this approach.