Mam ustawienie komponentu nadrzędnego/podrzędnego, w którym rodzic ładuje dane z serwera i przekazuje je dzieciom za pośrednictwem rekwizytów. W dziecku chciałbym utworzyć instancję kalendarza jQuery z niektórymi danymi, które otrzymuje od rodzica.Komponenty komponentów potomnych VueJs nie aktualizują się natychmiast
Aby czekać na dane przed skonfigurowaniem kalendarza, rozgłaszam zdarzenie w obiekcie nadrzędnym, w którym mam ustawienie detektora zdarzeń dla dziecka.
Słuchacz jest wywoływany u dziecka, ale jeśli I this.$log('theProp')
, jest niezdefiniowany. Jednakże, jeśli sprawdzę komponenty za pomocą devtools VueJs, związek rodzic/dziecko jest tam i dziecko otrzymało rekwizyt w międzyczasie.
Prop jest zdefiniowany na dziecku jako dynamiczny prop :the-prop="theProp"
. Ponieważ dziecko w końcu otrzymuje rekwizyt, zakładam, że moje ustawienie jest poprawne, ale wydaje się, że istnieje pewne opóźnienie. Rodzic ustawia rekwizyty w funkcji powrotu wywołania ajax i znowu: działa, z niewielkim opóźnieniem.
Próbowałem także zarejestrować słuchacza watch
na rekwizycie, aby móc ustawić kalendarz i upewnić się, że rekwizyt jest dostępny. Jednak detektor zegarka zostaje uruchomiony, ale this.$log('theProp')
jest nadal niezdefiniowany.
Jeśli przekazuję dane wraz z połączeniem broadcast, np. this.$broadcast('dataLoaded', theData)
, dziecko otrzymuje je w porządku. Ale wydaje mi się, że nie robię tego w ten sposób, ponieważ w zasadzie buduję swojego własnego pomocnika.
Nie publikuję żadnego kodu, ponieważ komponenty są dość duże, a devtools VueJs mówią mi, że sytuacja rodzica/dziecka działa.
Czy brakuje mi niektórych informacji? Czy istnieje niewielkie opóźnienie między ustawieniem wartości w rodzicu a dzieckiem, które je otrzymuje? Jaki byłby właściwy sposób oczekiwania na dane macierzyste dziecka?
Zwykle podczas renderowania danych do szablonu, czas nie ma tak dużego znaczenia, ponieważ dane są powiązane z szablonem. Ale w tym przypadku naprawdę potrzebuję danych, aby ustawić kalendarz, bo inaczej będzie źle.
Dzięki.
edit 1: oto jsfiddle: https://jsfiddle.net/dr3djo0u/1/ To zdaje się potwierdzać, że dane nie są dostępne natychmiast po zakończeniu transmisji. Obserwator działa, chociaż mógłbym prawie przysiąc, że czasami this.$log('someData')
zwrócił undefined
, kiedy ustawiłem tę walizkę.
Ale myślę, że mój problem może być gdzieś indziej, dziś będę wyglądał, nie mam teraz projektu ze mną.
edytuj 2: zrobił kilka dodatkowych testów. Mój problem polegał na tym, że a) detektory zdarzeń nie wydają się natychmiast odbierać danych i b) Próbowałem również zainicjować kalendarz w wywołaniu zwrotnym route.data
, jeśli już byłam w pobliżu (np. Gdy pochodzi z nadrzędnego), ale to wywołanie zwrotne trasy nazywa się zanim komponent będzie gotowy, więc też nie działał.
Moje rozwiązanie jest teraz to:
// works when the child route is loaded directly and parent finishes loading someData
watch: {
someData() {
this.initCalendar();
}
},
// works when navigating from parent (data already loaded)
ready() {
if (this.someData && this.someData.length) {
this.initCalendar()
}
}
Hi można dostarczyć prosty przykład kodu do odtworzenia problemu? – Nora
Jeśli "obserwujesz" zmienną, a jej wartość wewnątrz 'watch' jest niezdefiniowana, to znaczy, że coś jest ustawione na niezdefiniowane. –
Dzięki za komentarze. Zaktualizowałem moje pytania z tym, co odkryłem. – Chris