2016-04-18 4 views
2

У меня есть список компонентов, содержащих даты (отформатированные с toLocaleString()) и другие вещи. Кроме того, существует компонент для создания новых компонентов, в котором содержится форма с некоторыми входными полями, построенными с угловыми формами FormBuilder. Когда я печатаю быстро, задержки проверки и текст, который я печатаю, не отображаются сразу.Увеличение производительности на Angular2 inputfield

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

Есть ли способ удалить только поле ввода, которое я вводил, поскольку все остальные компоненты не могут изменить или toLocaleString() проблема?

+0

Вы могли бы предоставить образец plunker? – kemsky

ответ

5

Есть ли способ только повторно вызывать поле ввода я печатаю в, так как все остальные компоненты не могут изменить

Да, для компонентов, которые не будут меняться, установить стратегию обнаружения изменений для эти компоненты до OnPush. OnPush компонент будет проверяться только для изменений, если

  • любой из его входных свойств изменяется
  • это пожары событие (например, нажатие кнопки)
  • наблюдаемым (что является свойством ввода или локально-на-свойства компонента) выстреливает событие, и | async используется в шаблоне с наблюдаемой (см plunker в комментариях ниже этого ответа)
import {Component, Input, ChangeDetectionStrategy} from 'angular2/core'; 

@Component({ 
    ... 
    changeDetection: ChangeDetectionStrategy.OnPush 
}) 

Также рассмотрите возможность прослушивания изменений на вашем входе, подписавшись на valueChanges. Наблюдаемые угловые элементы доступны в элементе формы, если вы используете ngFormControl. Затем вы можете использовать debounce() только процесс меняется каждый второй или любой другой период времени уместно:

<input type=text [ngFormControl]="input1Control"> 
constructor() { 
    this.input1Control = new Control(); 
} 
ngOnInit() { 
    this.input1Control.valueChanges 
    .debounceTime(1000) 
    .subscribe(newValue => console.log(newValue)) 
} 

См https://stackoverflow.com/a/36849347/215945 для рабочего plunker.

+0

Я не нашел упоминания о «наблюдаемых огнях события». В [этом блоге] (http://blog.thoughtram.io/angular/2016/02/22/angular-2-change-detection-explained.html) они явно называют 'markForCheck' в' subscribe (...) 'callback. Возможно, это только с '| async'? –

+0

@ GünterZöchbauer см. Http://victorsavkin.com/post/110170125256/change-detection-in-angular-2 и http://stackoverflow.com/questions/35386822/changedetectionstrategy-onpush-and-observable-subscribe-in- угловое-2. В блоге thinkram, который вы упомянули, мне не очень нравится пример, который они дают, поскольку они меняют состояние отображения, поэтому 'markForCheck()' overkill ... им нужно только вызвать 'detectChanges()'. Мне нужно поиграть с этим еще немного (когда-нибудь) ... поскольку я не уверен, что на самом деле означает Виктор, когда он говорит, что «наблюдаемый огонь срабатывает». Если вы это выясните, прокомментируйте. –

+1

@ GünterZöchbauer, я создал [Plunker] (http://plnkr.co/edit/ezpbwhzowWkGQQKgn3FT?p=preview), чтобы проверить это, и то, что вы сказали, истинно: если входное свойство, которое является наблюдаемым, запускает событие AND '| async' используется в шаблоне, а затем обновляется представление. Если 'async' не используется, представление не обновляется. (Блог Савкина, вероятно, устарел.) Но это кажется странным для меня - ошибка? Если я настоятельно буду «подписываться»() ', я бы ожидал, что он будет работать так же, как работает' async' (т. Е. Декларативный/неявный 'subscribe()'). –

Смежные вопросы