Nano Hash - криптовалюты, майнинг, программирование

Angular 2: что делает сервис вне угловой зоны?

После того, как у меня возникли те же проблемы, что и у многих людей в StackOverflow, мне не удалось понять, что такое служба «вне угловой зоны»?

Я проверил все существующие вопросы по этой теме, и именно поэтому мне нужно задать этот:

Пример кода в любом компоненте с ChangeDetectionStrategy по умолчанию: (учитывая ссылку this.value в представлении)

this.myService.method().subscribe(e => {
    this.value = e;
  });

Является ли данный сервис не "вне угловой зоны", представление обновляется, с другой стороны, если это "вне угловой зоны" , представление не обновляется, если мы не вызываем ChangeDetectorRef.detectChanges().

Итак, вопрос: каково условие, чтобы узнать, находится ли служба внутри или снаружи «Angular Zone»?


Ответы:


1

Вам нужен код NgZone.isInAngularZone(). Это скажет вам, выполняется ли он там.

Источник: часы бились головой о стену, читая документы Angular, прежде чем писать это.

Кроме того, вы можете внедрить NgZone в свою службу и попробовать использовать this.ngZone.run(() => yourSubscriberCallback()), что должно помочь, хотя у меня очень неоднозначные результаты при попытке сделать это.

РЕДАКТИРОВАТЬ: Хорошо, мне удалось заставить мои вещи работать, посмотрим, поможет ли это вам.

В моем случае я использовал стороннюю библиотеку, которая включала прослушиватель изменений. Я использовал RXJS BehaviorSubject для распространения этих изменений на различные компоненты через службу, но эти изменения не учитывались.

Оказывается, это произошло потому, что метод, который я использовал в слушателе, выполнялся за пределами AngularZone.

Сначала я делал так:

export class Service {

  public BehaviorSubject<Thing> thingSubject = new BehaviorSubject<Thing>(new Thing());

  constructor(private ngZone:NgZone) {
    thirdPartyLibrary.listen(ngZone.run(() => myCallback.bind(_this)));
  }

  ...

}

А myCallback делал:

myCallback(thing) {
  this.thingSubject.next(thing);
}

Оказывается, это не выполнялось в Angular Zone правильно. Я изменил свой код на это, и это сработало:

export class Service {

  public BehaviorSubject<Thing> thingSubject = new BehaviorSubject<Thing>(new Thing());

  constructor(private ngZone:NgZone) {
    thirdPartyLibrary.listen(myCallback.bind(_this));
  }

  myCallback(thing) {
    this.ngZone.run(() => this.thingSubject.next(thing));
  }

}

После этого все мои подписчики получили сообщение в Angular Zone и запустили ожидаемые обновления.

11.08.2017

2

Насколько я знаю, невозможно проверить, работает ли что-то «внутри» или «снаружи» угловой зоны. Если вы используете zone.runOutsideAngular, он работает за пределами вашей зоны. Второе приходит мне на ум: зачем тебе это знать?

06.06.2017
  • Не обязательно во время выполнения. Я хочу знать, какие службы способны автоматически обновлять представление, а какие нет. 06.06.2017
  • Все, что вы будете запускать в zone.runOutsideAngular, не будет обновлять представление. 06.06.2017

  • 3

    Похоже, я нашел свои ответы сам, но я надеюсь, что это поможет другим людям:

    служба «Вне Angular Zone» — это класс, экземпляр которого не был создан внутри Angular Context. Многие библиотеки, использующие статические методы доступа, могут быть в этом случае, вот пример:

    http://techqa.info/programming/question/34592857/view-is-not-updated-on-change-in-angular2

    Мне повезло, что использовалась та же библиотека. Как описано в этом внешнем ресурсе, создание экземпляра объекта внешней библиотеки решит проблему обновления представления и позволит этой службе стать «внутри зоны Angular».

    06.06.2017
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..