【问题标题】:Specify @Input() parameter for Angular root component/module为 Angular 根组件/模块指定 @Input() 参数
【发布时间】:2017-09-18 12:40:41
【问题描述】:

我有 3 个由根 AppModule 引导的根组件。

如何为这些组件之一指定 @Input() 参数?

没有

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

AppModalComponent接走:

@Input() id: string;

未定义。

【问题讨论】:

  • 您在生命周期的哪个时间点检查id
  • 另外,还有一个open issue,我认为你实际上不能将输入传递给根组件

标签: angular angular-bootstrap


【解决方案1】:

据我所知,您不能将 @Input() 传递给引导组件。

但是您可以使用另一种方式来做到这一点 - 将值作为属性传递。

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');
    }
}

【讨论】:

  • 安全使用此方法的好方法是什么? “允许直接访问 DOM 会使您的应用程序更容易受到 XSS 攻击。仔细检查代码中对 ElementRef 的任何使用。有关更多详细信息,请参阅 Security Guide。”
  • 这是我唯一能想到的:this.myattribute = this.sanitizer.sanitize(SecurityContext.HTML, this.elementRef.nativeElement.getAttribute('myattribute'))
  • 值得记住的是这些以字符串的形式出现,所以如果你想要布尔/数字等,你需要摆弄它们
【解决方案2】:

正如@Grégory Gossart 所说,您不能像往常一样为引导组件传递@Input 数据。

这是因为 @Input 应该来自一个角度组件。因此,如果您的根应用程序直接在 HTML 中加载/引导,我认为它没有参考将提供 @Input 的内容。

正如许多 Angular 文档所评论的良好实践,并且可能因为它具有特定的行为,您应该只引导一个根应用程序。我认为您在这里的选择是添加一个您引导的根应用程序,它会导入您的其他应用程序(3)并将它们用作其中的模板。然后像往常一样传递@Input。真的没什么特别的。

如果您决定需要引导所有应用程序并需要外部数据,我认为另一种选择可能是将数据从 @Injectable 传递到您的根应用程序。但我觉得它更多地是针对特定目的。

编辑:我花了一些时间找到了我过去一天读过的这个博客,以及我提到 @Injectable 的原因。所以对作者来说很有价值,但很有趣。 Providing external data when bootstrapping Angular 2

【讨论】:

  • 我们正在将 Angular 组件添加到旧版 asp.net Web 表单整体中的各个位置,作为重构的基础。在这个阶段,如果不一次性重写全部内容,则无法选择一个根组件。
猜你喜欢
  • 2018-10-09
  • 1970-01-01
  • 2020-07-28
  • 2019-09-26
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
  • 2021-08-18
  • 2018-05-18
相关资源
最近更新 更多