5

Я создаю компонент. Поскольку мне нравится способ Apache Wicket делать вещи, я пытаюсь подражать способу передачи данных IModel. Для этого к дочернему компоненту я передаю модель и обратные вызовы, которые могут вытаскивать соответствующие значения, вместо того, чтобы вызывать функцию для получения данных вперед.Angular2: Как настроить @Input сеттеры в определенном порядке?

Проблема в том, что обработка вновь заданной модели использует обратные вызовы. Итак, если вызывающий модель вызывается до того, как будут установлены обратные вызовы, Угловые сбои.
Обход проблемы: отложить действия, требующие обратного вызова ngAfterViewInit() или такие.

Короче:

  • Как я могу контролировать порядок, в котором @Inputs устанавливаются?
  • Могу ли я полагаться на заказ в исходном коде?

Пример: (Изменение порядка здесь, кажется, чтобы сделать работу)

@Input() 
valueCallback: (item: any) => string 
    = app => { throw new Error("valueCallback not yet defined."); }; 

@Input() 
labelCallback: (item: ItemType) => string; 

шаблона с помощью этого ребенка компонента: (изменение порядка здесь не меняет порядок)

  <wu-checkboxes [groupName]="'includedApps'" 
          [options]="availableApps" 
          [valueCallback]="appsValueCallback" 
          [labelCallback]="appsLabelCallback" 
      > 

Как я уже упоминал выше, Angular2, похоже, соответствует порядку членов класса @Input и устанавливает/вызывает их в этом порядке. Вопрос в том, что де-факто или де-юре? Я не хочу полагаться на функции, которые работают только потому, что в настоящее время они закодированы таким образом. Я не очень разбираюсь в отражении JavaScript, поэтому я не могу сказать, будет ли это работать повсюду.

ответ

3

Вы можете использовать ngOnChanges(), который вызывается каждый раз, когда @Input() обновляется путем обнаружения изменений. Вы можете проверить в пределах ngOnChanges, доступны ли все входные значения и затем выполнить ваш код. Вам нужно позаботиться о том, чтобы последующие обновления не вызывали повторный вызов функции (в случае, если это нежелательно).

обновление

Порядок привязки (значение привязки и привязки событий) не определено в Angular2 и, следовательно, вы не можете полагаться на конкретный заказ.

+0

Спасибо за подсказку. Это подход, который я подразумеваю под «ngAfterViewInit() или такой» и хотел бы избежать. Для этого требуется довольно какой-то шаблонный код, и я, боюсь, подвержен ошибкам. –

+0

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

+0

Звучит правильно. Как насчет ответа на этот вопрос, и я соглашусь –