5

Tworzę komponent. Ponieważ podoba mi się sposób działania Apache Wicket, próbuję emulować sposób przekazywania danych przez IModel. W tym celu do komponentu potomnego przekazuję model i wywołania zwrotne, które mogą wyciągnąć odpowiednie wartości, zamiast wywoływania funkcji, aby uzyskać dane z góry.Angular2: Jak ustawić selektory @Input w określonej kolejności?

Problem polega na tym, że obsługa nowo ustawionego modelu używa wywołań zwrotnych. Tak więc, jeśli funkcja ustawiania modelu jest wywoływana przed ustawieniem funkcji zwrotnych, powoduje awarię kątową.
Obejście: odroczenie działań, które wymagają oddzwaniania do ngAfterViewInit() lub podobnego.

W skrócie:

  • Jak mogę kontrolować kolejność, w jakiej @Inputs są ustawione?
  • Czy mogę polegać na zamówieniu w kodzie źródłowym?

Przykład: (Zmiana kolejności tutaj wydaje się wykonać zadanie)

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

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

szablon przy użyciu tego składnika dziecko: (Zmiana kolejności tutaj nie zmienia kolejność)

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

Jak wspomniałem powyżej, Angular2 wydaje się podążać za kolejnością członków klasy @Input i ustawia/wywołuje je w tej kolejności. Pytanie brzmi: czy to de facto, czy de-jure? Nie chcę polegać na funkcjach, które działają tylko dlatego, że są obecnie kodowane w ten sposób. Nie wiem zbyt wiele o odbiorze JavaScript, więc nie mogę stwierdzić, czy to będzie działać wszędzie.

Odpowiedz

3

Można użyć numeru ngOnChanges(), który jest wywoływany za każdym razem, gdy @Input() jest aktualizowany przez wykrywanie zmian. Możesz sprawdzić w numerze ngOnChanges, czy wszystkie wartości wejściowe są już dostępne, a następnie wykonać kod. Należy jednak uważać, aby kolejne aktualizacje nie wywoływały ponownie wywołania funkcji (w przypadku, gdy nie jest to pożądane).

aktualizacja

Kolejność powiązań (wiązań wartości i powiązań zdarzeń) jest niezdefiniowane w Angular2, a zatem nie można powoływać się na konkretne zamówienie.

+0

Dzięki za cynk. Takie podejście rozumiem przez "ngAfterViewInit() lub takie" i chciałbym tego uniknąć. Wymaga to trochę kodu standardowego i jest, obawiam się, podatny na błędy. –

+0

Nie ma określonej kolejności wejść, dlatego mało prawdopodobne, aby można było tego uniknąć. –

+0

Brzmi nieźle. A co powiesz na odpowiedź i ja to zaakceptuję –