View is not updated on change in Angular2
Solution 1:
Although @Günter's answer is absolutely correct I want to propose a different solution.
The problem with Mousetrap
library is that it creates its instance outside of the angular zone (see here). But to fire change detection after each async event the instance should be instantiated inside the angular zone. You have two options to achieve this:
- Use dependency injection:
bootstrap(App, [provide(Mousetrap, { useFactory: () => new Mousetrap() }) ]);
// ...
@Component({
selector: 'my-app',
// ...
})
export class App {
constructor(@Inject(Mousetrap) mousetrap) {
this.mousetrap = mousetrap;
// ...
}
//...
}
- Just create instance of
Mousetrap
inside of the constructor:
@Component({
selector: 'my-app',
// ...
})
export class App {
constructor() {
this.mousetrap = new Mousetrap();
// ...
}
//...
}
In both cases you will have the ability to use the mousetrap instance like this:
ngOnInit() {
this.mousetrap.bind('i', () => this.incrementMode()); // It works now!!!
// ...
}
Now you don't need to use ngZone.run()
in every bind
call. In case of dependency injection you also can use this mousetrap
instance in any component/service of your application (not only in App
component).
See this plunk. I use dependency injection there.
Solution 2:
If MouseTrap
is something outside Angular you might need to inject NgZone
and run your code like
Mousetrap.bind('i', () => this.ngZone.run(() => this.incrementMode()));