Одноразовая обязательная директива не работает с Angular 4 - PullRequest
0 голосов
/ 26 февраля 2019

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

Я сделал этот пример;https://stackblitz.com/edit/angular-bhayzy

В моем HTML у меня есть:

<div>
  message: {{labels.message('hello')}}
</div>

<div *oneTime>
  message one-time: {{labels.message('secondHello')}}
</div>

Labels - это класс с функцией сообщения:

  public static message(field): string {
    console.log('called: ', field);
    return this.MYCLASS.LABELS[field] || 'no message';
  };

При запуске приложения я получаю 6 консолей ссообщение, 3 для 'привет', но также 3 для 'secondHello', но в этом HTML-элементе у меня есть * oneTime.

Отладка OneTimeDirective, кажется, я никогда не введу в директиву ...

1 Ответ

0 голосов
/ 26 февраля 2019

Вы отключаете ChangeDetectorRef после поворота виртуальной машины, потому что он находится внутри setTimeout.

setTimeout(() => view.detach());

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

Прочитайте, почему это происходит так много раз здесь:

Но если вы удалите setTimeout, тогда ваш шаблонне будет отображаться вообще. Директива

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

Как было правильно замечено, вы можетепользовательский чистый канал для повышения производительности вашей части кода.

...