Angular 7中NgStyle结合CSS Grid布局失效问题求助
解决Angular 7中NgStyle应用CSS Grid样式显示unsafe的问题
我之前也碰到过类似的升级坑,Angular 7之后动态设置Grid样式被标记为unsafe导致失效,核心原因是Angular从6.x版本开始收紧了动态样式的安全检查机制——像grid-column: '1 / span 2'这种包含特殊分隔符的样式值,会被DomSanitizer判定为不安全内容,直接阻止样式生效,而Angular 5的安全规则没这么严格,所以之前能正常运行。
这里有两种可行的解决方案,你可以根据代码情况选择:
方案一:用DomSanitizer显式标记样式值为安全
这是最直接的修复方式,通过Angular的安全工具把生成的Grid样式值标记为可信内容:
- 首先在组件中导入安全模块:
import { DomSanitizer, SafeStyle } from '@angular/platform-browser';
- 在组件构造函数中注入
DomSanitizer:
constructor(private sanitizer: DomSanitizer) { }
- 修改你的
getCssRowInfo和getCssColumnInfo方法,让它们返回经过安全处理的样式值:
getCssColumnInfo(mdsg: MdsgSimple): SafeStyle { // 替换成你原本生成grid-column值的业务逻辑 const columnValue = `${mdsg.layout.startCol} / span ${mdsg.layout.colSpan}`; return this.sanitizer.bypassSecurityTrustStyle(columnValue); } getCssRowInfo(mdsg: MdsgSimple): SafeStyle { // 同理处理grid-row的值 const rowValue = `${mdsg.layout.startRow} / span ${mdsg.layout.rowSpan}`; return this.sanitizer.bypassSecurityTrustStyle(rowValue); }
- 保持
getStyleForSubGroup方法不变,直接使用这些安全值即可,Angular会认可样式并正常渲染。
方案二:直接绑定单个样式属性(替代NgStyle)
如果不想修改太多方法,也可以放弃NgStyle对象,直接在模板中绑定单个Grid样式属性,这种方式下Angular的安全检查会更友好:
<div class="widthHeight100" [ngStyle]="getStyleForGroup(group)"> <div *ngFor="let subGroup of group?.childs" [style.grid-row]="getCssRowInfo(subGroup)" [style.grid-column]="getCssColumnInfo(subGroup)" [style.height]="getHeight(subGroup)" [style.width]="getWidth(subGroup)" [style.min-width]="getMinWidth(subGroup)" [style.max-width]="getMaxWidth(subGroup)" [style.min-height]="getMinHeight(subGroup)" [style.max-height]="getMaxHeight(subGroup)"> <!-- 子元素内容 --> </div> </div>
同样,这里的getCssRowInfo和getCssColumnInfo方法还是需要用方案一中的方式,返回经过DomSanitizer处理的安全值。
注意事项
- 只有当你的样式值是自身业务逻辑生成、不存在用户输入注入风险时,才使用
bypassSecurityTrustStyle,避免引入XSS安全隐患。 - Angular 5及更早版本的安全检查规则较宽松,所以之前的代码能正常运行,升级后安全策略收紧才导致了这个问题。
内容的提问来源于stack exchange,提问作者naresh mesineni
相关产品推荐
相关产品推荐

