19

I have 3 root components that get bootstrapped by the root AppModule.

How do you go about specifying an @Input() parameter to one of those components?

Neither

<app-modal [id]="'hard-coded value'"></app-modal>
<app-modal [id]="constantExportedByAppmodule"></app-modal>

are picked up by AppModalComponent:

@Input() id: string;

It is undefined.

2
  • At which point in the life cycle are you checking id? Commented Apr 21, 2017 at 13:35
  • 2
    Also, there is an open issue for this, I don't think that you can actually pass an input into the root component Commented Apr 21, 2017 at 13:44

2 Answers 2

38

As far as I know, you can not pass @Input() to a bootstraped component.

But you can use another way to do that - pass the value as an attribute.

index.html :

<my-app myAttribute="myAttributeValue">
    <div>Loading...</div>
</my-app>

app.component.ts :

@Component({
    selector: 'my-app',
    templateUrl: 'app.component.html',
    styleUrls: ['app.component.css']
})
export class AppComponent {
    constructor(private elementRef:ElementRef) {
        let myAttribute = this.elementRef.nativeElement.getAttribute('myAttribute');
    }
}
Sign up to request clarification or add additional context in comments.

3 Comments

What is a good way to use this method safely? "Permitting direct access to the DOM can make your application more vulnerable to XSS attacks. Carefully review any use of ElementRef in your code. For more detail, see the Security Guide."
This is the only thing I can think of: this.myattribute = this.sanitizer.sanitize(SecurityContext.HTML, this.elementRef.nativeElement.getAttribute('myattribute'))
Its worth remembering that these come in as strings, so you will need to fiddle them if you want boolean/numbers etc
5

As @Grégory Gossart said you can not pass @Input data as normal for bootstraped components.

It is because an @Input is expected to come from an angular component. So, If your root app is loaded/bootstraped directly in the HTML it has not reference of what Is gonna provide that @Input, I thought.

As good practice commented on many Angular docs, and probably because it specific behaviours, you should only bootstrap one root App. I think your option here is add a root app which you bootstrap and it imports your others(3) and use those as template in it. Then pass the @Input as normal. Really nothing special.

I think another option could be pass the data from an @Injectable to your root apps if you decide you need to bootstrap all them and need external data. But I feel it is more refered to specific purposes.

Edit: I took a time to find this blog I have read past day and reason why I said about @Injectable. So merits to the author, but interesting stuff. Providing external data when bootstrapping Angular 2

1 Comment

we're adding angular components into various places in a legacy asp.net web form monolith as a basis for refactor. at this stage one root component is not an option without rewriting the whole lot in one go.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.