Jak powinienem użyć nowej opcji static dla @ViewChild w Angular 8?

Jak skonfigurować nowe dziecko Angular 8 view?

@ViewChild('searchText', {read: ElementRef, static: false})
public searchTextInput: ElementRef;

Vs

@ViewChild('searchText', {read: ElementRef, static: true})
public searchTextInput: ElementRef;
Która jest lepsza? Kiedy należy stosować static:true vs static:false?
Author: Saksham, 2019-05-29

8 answers

W większości przypadków będziesz chciał użyć {static: false}. Ustawienie go w ten sposób zapewni znalezienie dopasowań zapytań, które są zależne od wiążącej rozdzielczości (jak dyrektywy strukturalne *ngIf, etc...).

Przykład Kiedy użyć static: false:

@Component({
  template: `
    <div *ngIf="showMe" #viewMe>Am I here?</div>
    <button (click)="showMe = !showMe"></button>
  ` 
})
export class ExampleComponent {
  @ViewChild('viewMe', { static: false })
  viewMe?: ElementRef<HTMLElement>; 

  showMe = false;
}

static: false będzie domyślnym zachowaniem awaryjnym w grze Angular 9. Czytaj więcej tutaj i tutaj

Opcja { static: true } została wprowadzona w celu obsługi tworzenia osadzonych widoków w locie. Podczas tworzenia widoku dynamicznie i chcesz uzyskać dostęp do TemplateRef, nie będziesz w stanie tego zrobić w ngAfterViewInit, ponieważ spowoduje to błąd ExpressionHasChangedAfterChecked. Ustawienie flagi statycznej na true spowoduje utworzenie widoku w ngOnInit.

W większości innych przypadków najlepszą praktyką jest stosowanie {static: false}.

Należy jednak pamiętać, że opcja { static: false } będzie domyślnie ustawiona w Angular 9. Oznacza to, że ustawienie znacznika statycznego nie jest już konieczne, chyba że chcesz użyć static: true opcja.

Możesz użyć polecenia angular CLI ng update, aby automatycznie uaktualnić aktualną bazę kodu.

Aby uzyskać przewodnik migracji i jeszcze więcej informacji na ten temat, Możesz sprawdzić tutaj i tutaj

Jaka jest różnica między zapytaniami statycznymi i dynamicznymi?

Opcja statyczna dla zapytań @Viewchild() i @ContentChild () określa, kiedy wyniki zapytań staną się dostępne.

With static queries (static: prawda), zapytanie zostanie rozwiązane po utworzeniu widoku, ale przed uruchomieniem wykrywania zmian. Wynik nigdy nie będzie jednak aktualizowany w celu odzwierciedlenia zmian w widoku, takich jak zmiany w blokach ngif i ngFor.

W przypadku zapytań dynamicznych (static: false) zapytanie jest rozwiązywane po ngAfterViewInit () lub ngaftercontentynit() odpowiednio dla @Viewchild() i @ContentChild (). Wynik zostanie zaktualizowany pod kątem zmian w widoku, takich jak zmiany w blokach ngif i ngFor.

 289
Author: Poul Kruijt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-04 18:53:43

Więc z reguły możesz wybrać:

  • { static: true } musi być ustawiony, gdy chcesz uzyskać dostęp do ViewChild w ngOnInit.

  • { static: false } dostępne tylko w ngAfterViewInit. To jest również to, co chcesz zrobić, gdy masz dyrektywę strukturalną (tj. *ngIf) na swoim elemencie w szablonie.

 108
Author: dave0688,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-18 07:50:32

From the angular docs

Static - czy rozwiązywać wyniki zapytań przed uruchomieniem wykrywania zmian (tzn. zwracać tylko wyniki statyczne). Jeśli ta opcja nie jest dostępna, kompilator powróci do domyślnego zachowania, które polega na użyciu wyników zapytań do określenia czasu rozwiązywania zapytań. Jeśli jakiekolwiek wyniki zapytania znajdują się wewnątrz zagnieżdżonego widoku (np. *ngIf), zapytanie zostanie rozwiązane po uruchomieniu wykrywania zmian. W przeciwnym razie zostanie rozwiązany przed przebiegi wykrywania zmian.

Lepszym pomysłem może być użycie static:true, jeśli dziecko nie zależy od żadnych warunków. Jeśli zmienia się widoczność elementu, to static:false może dać lepsze wyniki.

PS: ponieważ jest to nowa funkcja, być może będziemy musieli uruchomić benchmarki dla wydajności.

Edytuj

Jak wspomniał @Massimiliano Sartoretto, github commit może dać ci więcej wglądu.

 18
Author: Sachin Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-29 12:02:05

Przyszedł tutaj, ponieważ ViewChild był null w ngOnInit po aktualizacji do Angular 8.

Zapytania statyczne są wypełniane przed ngOnInit, podczas gdy zapytania dynamiczne (static: false) są wypełniane po. Innymi słowy, jeśli viewchild jest teraz null w ngOnInit po ustawieniu static: false, należy rozważyć zmianę na static: true lub przenieść kod do ngAfterViewInit.

Zobacz https://github.com/angular/angular/blob/master/packages/core/src/view/view.ts#L332-L336

Inne odpowiedzi są poprawne i wyjaśniają, dlaczego tak jest: zapytania zależne od dyrektyw strukturalnych, np. odniesienie do ViewChild wewnątrz ngif, powinny być uruchamiane po rozwiązaniu warunku tej dyrektywy, tj. po wykryciu zmian. Można jednak bezpiecznie używać static: true i w ten sposób rozwiązywać zapytania przed ngOnInit dla niezatwierdzonych odniesień. Imho ten konkretny przypadek nosi wzmiankę jako wyjątek null może być prawdopodobnie pierwszym sposobem na napotkanie tej specyfiki, jak to było dla ja.

 2
Author: corolla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-10 07:19:41

View child @angular 5+ token dwa argumenty ('local reference name', static: false|true)

@ViewChild('nameInput', { static: false }) nameInputRef: ElementRef;

Aby poznać różnicę między prawdą a fałszem sprawdź to

Static-czy rozwiązywać wyniki zapytań przed uruchomieniem wykrywania zmian (tzn. zwracać tylko wyniki statyczne). Jeśli ta opcja nie jest dostępna, kompilator powróci do domyślnego zachowania, które polega na użyciu wyników zapytań do określenia czasu rozwiązywania zapytań. Jeśli jakieś wyniki zapytania znajdują się wewnątrz * ngIf), zapytanie zostanie rozwiązane po uruchomieniu wykrywania zmian. W przeciwnym razie zostanie ona rozwiązana przed uruchomieniem wykrywania zmian.

 1
Author: Samar Abdallah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-24 08:19:16

W ng8 można ręcznie ustawić, kiedy ma być dostęp do komponentu podrzędnego w komponencie nadrzędnym. Gdy ustawisz wartość static na true, oznacza to, że komponent macierzysty otrzymuje definicję tylko w hooku onInit: Eg:

 // You got a childComponent which has a ngIf/for tag
ngOnInit(){
  console.log(this.childComponent);
}

ngAfterViewInit(){
  console.log(this.childComponent);
}

Jeśli wartość static jest false , wtedy defination zostanie odebrane tylko w ngaftervievinit (), w ngOnInit () otrzymasz undefined.

 0
Author: Tethys Zhang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-23 04:52:42

Zobacz dziecko

... Można go użyć do odniesienia do elementu szablonu.

...Na Zewnątrz konkretnego Odniesienia komponentu.

Ze składnią stylu dekoratora.. @ViewChild( selector) reference : ElementRef || QueryList.

Określonego elementu lub elementu odniesienia.

Użyj go w AfterViewInIt().

Możemy go użyć w Oninit().

Ale to dla konkretnego zastosowania ngAfterViewInit().

Na koniec {static : false} należy umieścić w @ViewChild( Useme , { static : false})... dla odniesienia do zmiennej szablonu.

Zmienna w pliku szablonu wygląda tak. #Useme.

 0
Author: Jaya Krishna Lakkoju,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-13 12:19:46

W przypadku kątowej 8 i wyższej, musisz wybrać poniższe rozwiązanie.

@ViewChild ('txtname', {static: false}) txtName: ElementRef;

Ważne rzeczy muszą zrozumieć przed wdrożeniem

{ static: true } needs to be set when you want to access the ViewChild in ngOnInit.
    
{ static: false } can only be accessed in ngAfterViewInit. This is also what you want to go for when you have a structural directive (i.e. *ngIf) on your element in your template.
 0
Author: Bhadresh Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-11 11:29:53