【发布时间】:2018-12-21 01:49:14
【问题描述】:
我试图将我的自定义组件标签放在一个字符串数组中,并在通过调用 bypassSecurityTrustHtml 对它们进行清理后通过 ngfor 将它们绑定到 innerhtml 属性......不幸的是,输出始终为空,但也没有清理错误。 ..
我做错了什么?
// adminpanel.component.ts
@Component({
selector: 'admin-panel',
templateUrl: './adminpanel.component.html'
})
export class AdminPanelComponent {
static GetRoutes(): Route[] {
return [
{ path: '', redirectTo: 'news', pathMatch: 'full' },
// 0
{ path: 'news', component: AdminNewsViewComponent },
// 1
{ path: 'users', component: AdminUsersViewComponent },
// 2
{ path: 'roles', component: AdminRolesViewComponent },
// 3
{
path: 'culturesettings',
redirectTo: 'culturesettings/wordvariables'
},
{
path: 'culturesettings',
component: AdminCultureSettingsViewComponent,
pathMatch: 'prefix',
children: AdminCultureSettingsViewComponent.GetRoutes()
},
// 4
{
path: 'account',
component: AdminAccountViewComponent
}
]
}
panels: AdminPanel[] = [];
routedTabs: RoutedTabs
constructor(private authService: AuthService, private routerService: RouterService, private sanitizer: DomSanitizer) {
this.routedTabs = new RoutedTabs("admin/panel", 2, authService, routerService);
var routes = AdminPanelComponent.GetRoutes().filter(x => x.component != undefined);
var comps = [
'<admin-news-view></admin-news-view>',
'<admin-users-view></admin-users-view>',
'<admin-roles-view></admin-roles-view>',
'<admin-culture-settings-view></admin-culture-settings-view>',
'<admin-account-view></admin-account-view>'
];
for (var i = 0; i < comps.length; i++) this.panels.push(new AdminPanel(i, routes[i], this.sanitizer.bypassSecurityTrustHtml(comps[i]) , this.sanitizer));
}
ngOnInit() {
this.routedTabs.MakeTabs(AdminPanelComponent.GetRoutes());
this.routedTabs.Subscribe();
this.routedTabs.Emit();
}
ngOnDestroy() {
this.routedTabs.Unsubscribe()
}
}
class AdminPanel {
index: number;
route: Route;
innerHtml: any = '';
constructor(index: number, route: Route, innerHtml: any, private sanitizer: DomSanitizer) {
this.index = index;
this.route = route;
this.innerHtml = innerHtml;
}
}
在我的 adminpanel.component.html 中:
<mat-tab-group (selectedTabChange)="routedTabs.onTabChange($event)" [(selectedIndex)]="routedTabs.selectedTab">
<mat-tab *ngFor="let panel of panels" label="{{ routedTabs.tabs[panel.index].label }}">
<div [innerHTML]="panel.innerHtml">
</div>
</mat-tab>
</mat-tab-group>
【问题讨论】:
-
Angular 默认清理所有内容 - angular.io/guide/… - 你为什么要自己做?
-
@WandMaker 因为如果我尝试直接输出字符串,那么控制台会警告我某些内容已被清理并且“
”例如将被视为威胁,即使它是我自己的组件,我想将其显示为可以在 ngfor 循环中使用的变量 -
我不确定我是否正确理解了您的问题?你想通过将组件标签作为字符串放入 innerhtml 属性来呈现自己的组件吗?
-
@SirDieter 是的,这正是我想要的,我该如何实现?
-
仅仅使用标签作为字符串是行不通的,因为如果在 dom 中弹出一个匹配选择器的元素,Angular 不会创建组件实例。
标签: javascript angular components ngfor angular-dom-sanitizer