How to combine template reference variable with ngIf?
<div *ngIf="true" myHighlight #tRefVar="myHighlight"></div>
<div>tRefVar is {{tRefVar.foo}}</div>
Despite being *ngIftrue, I get Cannot read property 'foo' of undefined. If I delete *ngIf, it works fine!
I tried using the Elvis operator tRefVar?.foo, which resolved the error, but then it never updates with the value.
https://plnkr.co/edit/5rsXygxK1sBbbkYdobjn?p=preview
What am I doing wrong?
As Tobias Bosch said
A variable declared inside * ngIf cannot be used outside * NgIf
https://github.com/angular/angular/issues/6179#issuecomment-233374700
( * ngIf * ngIf) , .
https://github.com/angular/angular/issues/6179#issuecomment-233579605
?
1) * ngIf
<h2 myHighlight #tRefVar="myHighlight">tRefVar is {{tRefVar.foo}}</h2>
<div>tRefVar is {{tRefVar?.foo}}</div>
angular viewDefinition:
function View_App_0(_l) {
return jit_viewDef1(0,[(_l()(),jit_textDef2(null,['\n '])),(_l()(),jit_elementDef3(0,
null,null,2,'h2',[['myHighlight','']],null,null,null,null,null)),jit_directiveDef4(16384,
[['tRefVar',4]],0,jit_HighlightDirective5,[jit_ElementRef6],null,null),(_l()(),
jit_textDef2(null,['tRefVar is ',''])),(_l()(),jit_textDef2(null,['\n '])),
(_l()(),jit_elementDef3(0,null,null,1,'div',[],null,null,null,null,null)),(_l()(),
jit_textDef2(null,['tRefVar is ',''])),(_l()(),jit_textDef2(null,['\n ']))],
null,function(_ck,_v) {
var currVal_0 = jit_nodeValue7(_v,2).foo;
_ck(_v,3,0,currVal_0);
var currVal_1 = ((jit_nodeValue7(_v,2) == null)? null: jit_nodeValue7(_v,2).foo);
_ck(_v,6,0,currVal_1);
});
}
. View_App_0. {{tRefVar?.foo}}
var currVal_1 = ((jit_nodeValue7(_v,2) == null)? null: jit_nodeValue7(_v,2).foo);
2
jit_directiveDef4(16384,
[['tRefVar',4]],0,jit_HighlightDirective5,[jit_ElementRef6],null,null),(_l()(),
jit_textDef2(null,['tRefVar is ','']))
2) * ngIf
<h2 *ngIf="true" myHighlight #tRefVar="myHighlight">tRefVar is {{tRefVar.foo}}</h2>
<div>tRefVar is {{tRefVar?.foo}}</div>
function View_App_1(_l) {
return jit_viewDef1(0,[(_l()(),jit_elementDef2(0,null,null,2,'h2',[['myHighlight',
'']],null,null,null,null,null)),jit_directiveDef3(16384,[['tRefVar',4]],0,jit_HighlightDirective4,
[jit_ElementRef5],null,null),(_l()(),jit_textDef6(null,['tRefVar is ','']))],
null,function(_ck,_v) {
var currVal_0 = jit_nodeValue7(_v,1).foo;
_ck(_v,2,0,currVal_0);
});
}
function View_App_0(_l) {
return jit_viewDef1(0,[(_l()(),jit_textDef6(null,['\n'])),(_l()(),jit_anchorDef8(16777216,
null,null,1,null,View_App_1)),jit_directiveDef3(16384,null,0,jit_NgIf9,[jit_ViewContainerRef10,
jit_TemplateRef11],{ngIf:[0,'ngIf']},null),(_l()(),jit_textDef6(null,['\n'])),
(_l()(),jit_elementDef2(0,null,null,1,'div',[],null,null,null,null,null)),(_l()(),
jit_textDef6(null,['tRefVar is ',''])),(_l()(),jit_textDef6(null,['\n ']))],
function(_ck,_v) {
var currVal_0 = true;
_ck(_v,2,0,currVal_0);
},function(_ck,_v) {
var _co = _v.component;
var currVal_1 = ((_co.tRefVar == null)? null: _co.tRefVar.foo);
_ck(_v,5,0,currVal_1);
});
}
Angular View_App_1 View_App_0. {{tRefVar?.foo}}
var currVal_1 = ((_co.tRefVar == null)? null: _co.tRefVar.foo);
, View_App_0 , . View_App_1
var currVal_0 = jit_nodeValue7(_v,1).foo;
, .
?
1) , , [hidden] css *ngIf
2) , tRefVar
<ng-container *ngIf="true">
<h2 myHighlight #tRefVar="myHighlight">tRefVar is {{tRefVar.foo}}</h2>
<div>tRefVar is {{tRefVar?.foo}}</div>
</ng-container>
3) @ViewChild, . @ViewChildren
<div *ngIf="true" myHighlight #tRefVar="myHighlight"></div>
, *ngIf () a ng-template,
<ng-template [ngIf]="true">
<h2 myHighlight #tRefVar="myHighlight">Hello {{name}}, tRefVar is {{tRefVar.foo}}</h2>
</ng-template>
<div>tRefVar is {{tRefVar?.foo}}</div>
, #tRefVar Child (div ) (ng-template ).<div> <div>, .
, Child/Sibling.
, , ng-container ngIf , tRevVar :
<ng-container *ngIf="true">
<h2 myHighlight #tRefVar="myHighlight">Hello {{name}}, tRefVar is {{tRefVar.foo}}</h2>
<div>tRefVar is {{tRefVar?.foo}}</div>
</ng-container>
Plunkr: https://plnkr.co/edit/cqrsDVGwa90o1FGWgE22?p=preview
, , , , .
, .
" tRefVar ?":
, undefined. , ( undefined) . elvis .
myObj: any;
ngOnInit() {
myObj.text = 'my Text';
}
<div>{{ myObj?.text }}</div>
, :
myObj: any = {};
ngOnInit() {
myObj.text = 'my Text';
}
<div>{{ myObj?.text }}</div>
, . , , , . .
by @lexith, *ngIf, . ,<div *ngIf="true" myHighlight #tRefVar="myHighlight"></div>
<div [hidden]=false myHighlight #tRefVar="myHighlight"></div>, .
:
@Component({
selector: 'my-app',
template: `
<div>
<h2 [hidden]=false myHighlight #tRefVar="myHighlight">Hello {{name}}, tRefVar is {{tRefVar.foo}}</h2>
<div>tRefVar is {{tRefVar?.foo}}</div>
</div>
`,
})
Angular 8, , false.
:
<button type="button" (click)="eventsTable.someMethod()">Click Me!</button>
<div *ngIf="someValue" #eventsTable >
SHIBAMBO!
</div>
:
export class EventsComponent {
@ViewChild('eventsTable', {static: false}) eventsTable: Table;
constructor() {
console.log(this.eventsTable)
}
}
Angular 9 false .

