【发布时间】:2020-06-07 23:44:30
【问题描述】:
所以我一直在寻找如何从服务器加载 CSS 和 HTML。
我想要实现的是请求显示某个模板,该模板将 HTML 和 CSS 发送到网站并将其与一些用户定义的样式(如颜色)一起加载
到目前为止,我能够使用以下方法注入 HTML:
<div [innerHTML]="template | sanitizeHtml"></div>
和
import { Pipe, PipeTransform, SecurityContext } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
@Pipe({
name: 'sanitizeHtml'
})
export class SanitizeHtmlPipe implements PipeTransform {
constructor(private sanitizer: DomSanitizer) { }
transform(value: any): any {
return this.sanitizer.bypassSecurityTrustHtml(value);
}
}
我从不同的帖子和博客中看到的(谢谢)。
我一直在构建的 HTML 就像一个魅力:
this.template = "<div class='template' style='width: 1080px; height: 1920px; background-color: #212121;'><div class='clr-row' style='padding:45px 0px 10px 25px; position: relative; width: inherit;'><div class='clr-col-5'><div style='width: 230px; height: 60px; background-image: url(*LINK_TO_IMAGE*); background-repeat: no-repeat; float: left;'></div></div></div></div>"
此 HTML 是完整模板的一部分。 所以我想做的是通过使用变量来使用样式。
所以我尝试的是制作一个样式对象:
public style: {};
public template: string;
ngOnInit(){
this.style = {
template: {
"color": "#D8B088",
}
}
this.template = "<div [ngStyle]='style.template' class='template' style='width: 1080px; height: 1920px; background-color: #212121;'><div class='clr-row' style='padding:45px 0px 10px 25px; position: relative; width: inherit;'><div class='clr-col-5'><div style='width: 230px; height: 60px; background-image: url(*LINK_TO_IMAGE*); background-repeat: no-repeat; float: left;'></div></div></div></div>"
}
我已经使用 [ngStyle]='style.template' 将样式对象添加到模板中,由于某种原因样式没有被加载,所以我尝试使用 camelCasing 代替,但仍然没有成功。
那么有人知道如何让 CSS 在这种情况下工作,并最终使用用户定义的样式吗?
提前致谢。
编辑 1:
我还在 app.module.ts 中包含了 Sanitize 管道:
@NgModule({
declarations: [
...,
SanitizeHtmlPipe
],
...
});
(对于那些想知道的人)
编辑 2:
所以我一直在研究我想用这些模板做什么:
用户可以注册多个设备来显示 Office 365 中的预订。用户可以通过 2 种方式设置模板,但这并不重要。当用户想要显示特定设备的模板时,他们会转到 /device/:deviceid/template/:templateid。 这样,组件将加载到该设备的模板中。 因此,首先我们加载包含模板用户样式的设备设置。之后,我们从 office365 中加载必须在模板中显示的数据,最后加载带有模板样式的模板。 所以会有3个请求到服务器。 DeviceSettings -- Data Office365 -- 模板
到目前为止,我已经能够加载数据并将其放置在模板中,但是模板在本地可用,而不是从服务器上可用。 我想要从服务器请求模板的原因是会有一个管理门户,这些模板将在其中制作和管理。 这些模板将具有名称、HTML 和 CSS。
【问题讨论】:
-
只为div添加类并使用scss/css文件添加样式不是更合乎逻辑吗?目前模板不可读。也可以解决问题。
-
您已经在使用 style 属性设置 div 的样式。同样,您使用了 ngStyle。可能是因为它没有加载。
-
@Billy Cottrell 是的。我明白那个。但是您可以只更改类名并将所有样式代码存储在单独的 css/scss 文件中。它使代码更干净。拥有多个模板也没有问题。在项目中,我现在正在使用哪个模板,现在有 4 个模板,但我可以很容易地添加新模板。所以我建议在要放入经过消毒的 InnerHtml 的元素上使用 NgClass。
-
@Billy Cottrell 如果仅基于用户设置您只更改类,并且其他所有内容都存储在 scss / css 中,应用程序应该运行得很快。在这种情况下,您将拥有数百个特定于 css 的类。我会写一个答案,我会怎么做。
-
无论哪种方式,现在您只使用 TrustHtml。但是知道您的模板也包含样式,您还需要使用 TrustStyles。不知道两者是否可以在同一个html上使用。但我认为不是。所以事情应该做不同的事情。
标签: javascript html css angular