Angular 2 + SignalR - доступ к внутренним Angular внешним script

Я использую SignalR с приложением Angular2, где мы хотим, чтобы методы клиента SignalR вызывали в приложение Angular с данными, полученными с сервера, а затем Angular переделывали привязки данных. Например, в приложении Angular я выставляю глобальную переменную для нашего магазина, на которой есть коллекция.

например.   (TypeScript)

....
export class Store{
  Customers : Customer[];
  constructor(){
    window["GlobalStore"] = this;
  }

  setCustomers (customers : Customer[]){
    this.Customers = customers;
  }
}
....

и в моем клиенте SignalR javascript У меня есть функция:

$.connection.MyHub.client.receive = function(data){
  //Call into the Angular app and set data, which is then rendered in views
  //via data-binding
  //data contains a json array of customers
  window.GlobalStore.setCustomers(data);
}

Кажется, что это работает и устанавливает данные в хранилище, однако, когда данные reset Angular, похоже, не обнаруживают изменений, и, следовательно, пользовательский интерфейс не обновляется.

Это не проблема с типизацией данных, так как даже прохождение простой строки/целого и т.д. в хранилище правильно задает свойство store при отладке, однако структура Angular, похоже, не запускает обнаружение изменений и обновить представления.

Любые идеи о том, как либо: A) Вручную запускать привязку Angular, чтобы она обновляла представление? B) Вызовите методы в приложении Angular 2 из внешнего с помощью другого средства?

Спасибо

Ответ 1

Чтобы вручную запустить обнаружение изменений:

  • Используйте метод ApplicationRef::tick().
  • Используйте NgZone::run() метод, чтобы обернуть код, который должен выполняться внутри зоны angular.

Вы можете получить их, используя инъекцию зависимостей или загрузив приложение с помощью platform().application(bindings).bootstrap(Component):

import { platform } from 'angular2/angular2';

const app = platform().application([] /* - bindings */); // you can use `app.tick()` 
const zone = app.zone; // you can use `zone.run`

app.bootstrap(Component);