String interpolation for angular HTML selector
up vote
0
down vote
favorite
I have many components with different selectors like app-protocol, app-inspection, app-generalview etc. I want the rendered component to be based on a variable, something like:
In Typescript
view = 'protocol'; // or inspection or generalview
In HTML
<app-view> </app-view>
or
<div [innerHTML] = "'<app-view>'"> </div>
Both HTML examples however don't work. I know I can use an *ngSwitch but I could have many cases and would like to know if there is a way to avoid doing that. Thanks a lot.
html angular rendering
add a comment |
up vote
0
down vote
favorite
I have many components with different selectors like app-protocol, app-inspection, app-generalview etc. I want the rendered component to be based on a variable, something like:
In Typescript
view = 'protocol'; // or inspection or generalview
In HTML
<app-view> </app-view>
or
<div [innerHTML] = "'<app-view>'"> </div>
Both HTML examples however don't work. I know I can use an *ngSwitch but I could have many cases and would like to know if there is a way to avoid doing that. Thanks a lot.
html angular rendering
Maybe switching the selector to[app-protocol]
(and so on), and use the tag as<div app-protocol>
? Never tried it, but the selector is aquerySelector
string, so this should work
– trichetriche
Nov 9 at 13:18
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I have many components with different selectors like app-protocol, app-inspection, app-generalview etc. I want the rendered component to be based on a variable, something like:
In Typescript
view = 'protocol'; // or inspection or generalview
In HTML
<app-view> </app-view>
or
<div [innerHTML] = "'<app-view>'"> </div>
Both HTML examples however don't work. I know I can use an *ngSwitch but I could have many cases and would like to know if there is a way to avoid doing that. Thanks a lot.
html angular rendering
I have many components with different selectors like app-protocol, app-inspection, app-generalview etc. I want the rendered component to be based on a variable, something like:
In Typescript
view = 'protocol'; // or inspection or generalview
In HTML
<app-view> </app-view>
or
<div [innerHTML] = "'<app-view>'"> </div>
Both HTML examples however don't work. I know I can use an *ngSwitch but I could have many cases and would like to know if there is a way to avoid doing that. Thanks a lot.
html angular rendering
html angular rendering
asked Nov 9 at 13:13
Kaloyan Dimitrov
255
255
Maybe switching the selector to[app-protocol]
(and so on), and use the tag as<div app-protocol>
? Never tried it, but the selector is aquerySelector
string, so this should work
– trichetriche
Nov 9 at 13:18
add a comment |
Maybe switching the selector to[app-protocol]
(and so on), and use the tag as<div app-protocol>
? Never tried it, but the selector is aquerySelector
string, so this should work
– trichetriche
Nov 9 at 13:18
Maybe switching the selector to
[app-protocol]
(and so on), and use the tag as <div app-protocol>
? Never tried it, but the selector is a querySelector
string, so this should work– trichetriche
Nov 9 at 13:18
Maybe switching the selector to
[app-protocol]
(and so on), and use the tag as <div app-protocol>
? Never tried it, but the selector is a querySelector
string, so this should work– trichetriche
Nov 9 at 13:18
add a comment |
1 Answer
1
active
oldest
votes
up vote
0
down vote
You can rended dinamically the component using componentFactoryResolver
and viewContainerRef
.
Here's a simple example, I've created the component called Cmp1Component
that is going to be renderd dinamically.
App.module.ts
@NgModule(
declarations: [
AppComponent,
Cmp1Component,
Cmp2Component
],
imports: [
BrowserModule
],
providers: ,
bootstrap: [AppComponent],
entryComponents:[
Cmp1Component
]
)
export class AppModule
App.component.html
A component will be rendered down here:
<div #placeholder></div>
App.component.ts
import Component, ComponentFactoryResolver, ViewChild, ViewContainerRef from '@angular/core';
import Cmp1Component from './cmp1/cmp1.component';
@Component(
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
)
export class AppComponent
public done = false;
@ViewChild("placeholder", read: ViewContainerRef) placeholderRef: ViewContainerRef;
constructor(
public viewContainerRef: ViewContainerRef,
private componentFactoryResolver: ComponentFactoryResolver
)
ngAfterViewChecked(): void
if(!!this.placeholderRef && !this.done)
this.done = true;
const factory = this.componentFactoryResolver.resolveComponentFactory(Cmp1Component);
const componentRef = this.placeholderRef.createComponent(factory);
componentRef.changeDetectorRef.detectChanges();
Result:
One thing : you may not need to put the logic into the ngAfterViewChecked
cycle. I've done this logic just to show you how it works. If you actually put the code in a function that will be executed when everything is rendered, then you know for sure that placeHolderRef
is not null or undefined.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53226385%2fstring-interpolation-for-angular-html-selector%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
You can rended dinamically the component using componentFactoryResolver
and viewContainerRef
.
Here's a simple example, I've created the component called Cmp1Component
that is going to be renderd dinamically.
App.module.ts
@NgModule(
declarations: [
AppComponent,
Cmp1Component,
Cmp2Component
],
imports: [
BrowserModule
],
providers: ,
bootstrap: [AppComponent],
entryComponents:[
Cmp1Component
]
)
export class AppModule
App.component.html
A component will be rendered down here:
<div #placeholder></div>
App.component.ts
import Component, ComponentFactoryResolver, ViewChild, ViewContainerRef from '@angular/core';
import Cmp1Component from './cmp1/cmp1.component';
@Component(
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
)
export class AppComponent
public done = false;
@ViewChild("placeholder", read: ViewContainerRef) placeholderRef: ViewContainerRef;
constructor(
public viewContainerRef: ViewContainerRef,
private componentFactoryResolver: ComponentFactoryResolver
)
ngAfterViewChecked(): void
if(!!this.placeholderRef && !this.done)
this.done = true;
const factory = this.componentFactoryResolver.resolveComponentFactory(Cmp1Component);
const componentRef = this.placeholderRef.createComponent(factory);
componentRef.changeDetectorRef.detectChanges();
Result:
One thing : you may not need to put the logic into the ngAfterViewChecked
cycle. I've done this logic just to show you how it works. If you actually put the code in a function that will be executed when everything is rendered, then you know for sure that placeHolderRef
is not null or undefined.
add a comment |
up vote
0
down vote
You can rended dinamically the component using componentFactoryResolver
and viewContainerRef
.
Here's a simple example, I've created the component called Cmp1Component
that is going to be renderd dinamically.
App.module.ts
@NgModule(
declarations: [
AppComponent,
Cmp1Component,
Cmp2Component
],
imports: [
BrowserModule
],
providers: ,
bootstrap: [AppComponent],
entryComponents:[
Cmp1Component
]
)
export class AppModule
App.component.html
A component will be rendered down here:
<div #placeholder></div>
App.component.ts
import Component, ComponentFactoryResolver, ViewChild, ViewContainerRef from '@angular/core';
import Cmp1Component from './cmp1/cmp1.component';
@Component(
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
)
export class AppComponent
public done = false;
@ViewChild("placeholder", read: ViewContainerRef) placeholderRef: ViewContainerRef;
constructor(
public viewContainerRef: ViewContainerRef,
private componentFactoryResolver: ComponentFactoryResolver
)
ngAfterViewChecked(): void
if(!!this.placeholderRef && !this.done)
this.done = true;
const factory = this.componentFactoryResolver.resolveComponentFactory(Cmp1Component);
const componentRef = this.placeholderRef.createComponent(factory);
componentRef.changeDetectorRef.detectChanges();
Result:
One thing : you may not need to put the logic into the ngAfterViewChecked
cycle. I've done this logic just to show you how it works. If you actually put the code in a function that will be executed when everything is rendered, then you know for sure that placeHolderRef
is not null or undefined.
add a comment |
up vote
0
down vote
up vote
0
down vote
You can rended dinamically the component using componentFactoryResolver
and viewContainerRef
.
Here's a simple example, I've created the component called Cmp1Component
that is going to be renderd dinamically.
App.module.ts
@NgModule(
declarations: [
AppComponent,
Cmp1Component,
Cmp2Component
],
imports: [
BrowserModule
],
providers: ,
bootstrap: [AppComponent],
entryComponents:[
Cmp1Component
]
)
export class AppModule
App.component.html
A component will be rendered down here:
<div #placeholder></div>
App.component.ts
import Component, ComponentFactoryResolver, ViewChild, ViewContainerRef from '@angular/core';
import Cmp1Component from './cmp1/cmp1.component';
@Component(
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
)
export class AppComponent
public done = false;
@ViewChild("placeholder", read: ViewContainerRef) placeholderRef: ViewContainerRef;
constructor(
public viewContainerRef: ViewContainerRef,
private componentFactoryResolver: ComponentFactoryResolver
)
ngAfterViewChecked(): void
if(!!this.placeholderRef && !this.done)
this.done = true;
const factory = this.componentFactoryResolver.resolveComponentFactory(Cmp1Component);
const componentRef = this.placeholderRef.createComponent(factory);
componentRef.changeDetectorRef.detectChanges();
Result:
One thing : you may not need to put the logic into the ngAfterViewChecked
cycle. I've done this logic just to show you how it works. If you actually put the code in a function that will be executed when everything is rendered, then you know for sure that placeHolderRef
is not null or undefined.
You can rended dinamically the component using componentFactoryResolver
and viewContainerRef
.
Here's a simple example, I've created the component called Cmp1Component
that is going to be renderd dinamically.
App.module.ts
@NgModule(
declarations: [
AppComponent,
Cmp1Component,
Cmp2Component
],
imports: [
BrowserModule
],
providers: ,
bootstrap: [AppComponent],
entryComponents:[
Cmp1Component
]
)
export class AppModule
App.component.html
A component will be rendered down here:
<div #placeholder></div>
App.component.ts
import Component, ComponentFactoryResolver, ViewChild, ViewContainerRef from '@angular/core';
import Cmp1Component from './cmp1/cmp1.component';
@Component(
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
)
export class AppComponent
public done = false;
@ViewChild("placeholder", read: ViewContainerRef) placeholderRef: ViewContainerRef;
constructor(
public viewContainerRef: ViewContainerRef,
private componentFactoryResolver: ComponentFactoryResolver
)
ngAfterViewChecked(): void
if(!!this.placeholderRef && !this.done)
this.done = true;
const factory = this.componentFactoryResolver.resolveComponentFactory(Cmp1Component);
const componentRef = this.placeholderRef.createComponent(factory);
componentRef.changeDetectorRef.detectChanges();
Result:
One thing : you may not need to put the logic into the ngAfterViewChecked
cycle. I've done this logic just to show you how it works. If you actually put the code in a function that will be executed when everything is rendered, then you know for sure that placeHolderRef
is not null or undefined.
edited Nov 9 at 13:47
answered Nov 9 at 13:42
Jacopo Sciampi
1,34616
1,34616
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53226385%2fstring-interpolation-for-angular-html-selector%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Maybe switching the selector to
[app-protocol]
(and so on), and use the tag as<div app-protocol>
? Never tried it, but the selector is aquerySelector
string, so this should work– trichetriche
Nov 9 at 13:18