Глобальная служба сообщений в угловых задачах

Хотя есть много хороших объяснений выше, я пропускаю практический способ разделения шаблонов на заголовок и тело. Моя главная задача - избегать перекомпиляции всех пользователей шаблонов, когда я меняю свое определение. Все экземпляры шаблонов в корпусе шаблона не являются жизнеспособным решением для меня, поскольку автор шаблона может не знать всех, если его использование и пользователь шаблона могут не иметь права его модифицировать. Я принял следующий подход, который также работает и для более старых компиляторов (gcc 4.3.4, aCC A.03.13).

Для каждого использования шаблона в его собственном файле заголовка (сгенерированном из модели UML) имеется typedef, , Его тело содержит экземпляр (который заканчивается в библиотеке, которая связана в конце). Каждый пользователь шаблона включает этот файл заголовка и использует typedef.

Схематический пример:

MyTemplate.h:

#ifndef MyTemplate_h
#define MyTemplate_h 1

template <class T>
class MyTemplate
{
public:
  MyTemplate(const T& rt);
  void dump();
  T t;
};

#endif

MyTemplate.cpp:

#include "MyTemplate.h"
#include <iostream>

template <class T>
MyTemplate<T>::MyTemplate(const T& rt)
: t(rt)
{
}

template <class T>
void MyTemplate<T>::dump()
{
  cerr << t << endl;
}

MyInstantiatedTemplate.h:

#ifndef MyInstantiatedTemplate_h
#define MyInstantiatedTemplate_h 1
#include "MyTemplate.h"

typedef MyTemplate< int > MyInstantiatedTemplate;

#endif

MyInstantiatedTemplate.cpp:

#include "MyTemplate.cpp"

template class MyTemplate< int >;

main.cpp:

#include "MyInstantiatedTemplate.h"

int main()
{
  MyInstantiatedTemplate m(100);
  m.dump();
  return 0;
}

Таким образом, нужно будет перекомпилировать только экземпляры шаблонов, не всех пользователей шаблонов (и зависимостей).

0
задан tarek 3 March 2019 в 16:41
поделиться

1 ответ

Создайте Subject в вашем messageService следующим образом, когда в массив messages добавляется ошибка, вы должны вызывать метод next() с массивом сообщений.

export class MessageService {
  messages: string[] = [];
  messages$: new Subject<any>();

  add(message: string) {
    this.messages.push(message);
    this.messages$.next(this.messages);
  }

  clear() {
    this.messages = [];
  }

  constructor() { }
}

В вашем компоненте вы должны обновлять DOM при каждом добавлении сообщения в массив сообщений, поэтому вам необходимо подписаться на тему message$ следующим образом

export class MessagesComponent implements OnInit {
  public messages: Array<any> = [];
  constructor(public messageService:MessageService) { }

  ngOnInit() {
    this.messageService.messages$.subscribe(messages => this.messages = messages);
  }

}
[1110 ] ваш HTML должен быть

<div *ngIf="messages.length">

  <h2>Messages</h2>
  <button class="clear"
          (click)="messageService.clear()">clear</button>
  <div *ngFor='let message of messages'> {{message}} </div>

</div>
0
ответ дан Bear Nithi 3 March 2019 в 16:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: