Просмотр не обновляется при изменении в Angular2

Я начал изучать Angular2 (я прихожу с Angular1 и немного фона React), и я столкнулся с проблемой.

Я хочу связать определенные нажатия клавиш с действиями в моем компоненте, поэтому я решил использовать жизненный цикл Angular2 для привязки / развязывания действий.

Однако, если я что-то делаю из-за обратного вызова Mousetrap, он работает, но он не отображается, и изменение не отображается до тех пор, пока цикл дайджеста не будет запущен.

Нужно ли мне явно что-то запускать, чтобы обновить представление?

Может ли кто-нибудь помочь мне разобраться, что происходит? Любая помощь будет очень оценена.


import {Component} from 'angular2/core'; const Mousetrap = require('mousetrap'); @Component({ template: `
Video template: Mode {{ mode }}
` }) export class Video { public mode: number; constructor() { this.mode = 0; } ngOnInit() { console.log('hello Video component'); Mousetrap.bind('d', () => console.log('this.mode=', this.mode)); Mousetrap.bind('i', () => this.incrementMode()); // doesn't work this.incrementMode(); // works this.incrementMode(); // works setTimeout(() => this.incrementMode(), 4000); // works } incrementMode() { console.log('incMode', this.mode++); }; ngOnDestroy() { console.log('bye bye Video component'); Mousetrap.unbind(['d', 'i']); } }

Хотя ответ @ Günter абсолютно правильный, я хочу предложить другое решение.

Проблема с библиотекой Mousetrap заключается в том, что она создает свой экземпляр вне угловой зоны (см. Здесь ). Но для того, чтобы скрыть обнаружение изменений после каждого асинхронного события, экземпляр должен быть создан внутри угловой зоны . У вас есть два варианта:

  1. Используйте инъекцию зависимостей:
 bootstrap(App, [provide(Mousetrap, { useFactory: () => new Mousetrap() }) ]); // ... @Component({ selector: 'my-app', // ... }) export class App { constructor(@Inject(Mousetrap) mousetrap) { this.mousetrap = mousetrap; // ... } //... } 
  1. Просто создайте экземпляр Mousetrap внутри конструктора:
 @Component({ selector: 'my-app', // ... }) export class App { constructor() { this.mousetrap = new Mousetrap(); // ... } //... } 

В обоих случаях у вас будет возможность использовать экземпляр мышеловки следующим образом:

 ngOnInit() { this.mousetrap.bind('i', () => this.incrementMode()); // It works now!!! // ... } 

Теперь вам не нужно использовать ngZone.run() в каждом вызове bind . В случае инъекции зависимостей вы также можете использовать этот экземпляр mousetrap в любом компоненте / службе вашего приложения (не только в компоненте App ).

См. Этот плунж . Я использую там инъекцию зависимостей.

Если MouseTrap является чем-то вне Углового, вам может потребоваться ввести NgZone и запустить ваш код, как

  Mousetrap.bind('i', () => this.ngZone.run(() => this.incrementMode())); 
  • угловое2 наблюдаемое, получение неопределенного в компоненте
  • Угловое изменение на каждом нажатии клавиши
  • в Angular2 как узнать, когда ЛЮБОЕ поле ввода ввода потеряло фокус
  • угловое обнаружение изменений и ChangeDetectionStrategy.OnPush
  • Как вручную использовать ленивый модуль?
  • Запускать функцию controllerа всякий раз, когда открывается или отображается вид
  • Угловая загрузка файла
  • Как динамически создавать загрузочные модалы как компоненты Angular2?
  • Угловые динамические вкладки с выбранными компонентами
  • Угловая 2 Труба заказа
  • Угловой 2/4/5 - Устанавливает базовый href динамически
  • Interesting Posts

    Временное блокирование всех входящих и исходящих, за исключением хром в брандмауэре Windows

    Как визуализировать изображение камеры YUV-NV21 на фоне в libgdx с OpenGLES 2.0 в режиме реального времени?

    Преимущества Java7 с ресурсами

    Использование JavaFX Platform.runLater и доступ к пользовательскому интерфейсу из другого streamа

    Создание отношения OneToOne к ленивому

    Конкат два файла mp4 с ffmpeg без потери качества

    Различные разрывы на грань гистограммы ggplot2

    Как я могу ограничить GenericForeignKey Django списком моделей?

    Есть ли приложение, которое может рассказать вам, какие DLL и другие зависимости использует программа?

    Как перенаправить stdout в файл и консоль с помощью скриптов?

    sed -i +, что тот же вариант в SOLARIS

    Окончательный способ использования Picasa в домашней сети

    Есть ли способ заставить оболочку Windows cmd расширять подстановочные пути?

    Завершение программы Java

    Преобразовать строку в int в одной строке кода, используя LINQ

    Давайте будем гением компьютера.