我们有一个现有主题,希望对其进行实验。例如,可以实验不同的主题列表视图样式。为此,我们使用 Google Optimize 进行 A/B 测试。目前计划向 50% 的用户展示未修改的主题,其余用户展示更新后的主题。由于我们仅对一小部分进行实验,原始版本和变体应在同一主题中定义。问题是父级 CSS 类名相同,而我们希望根据特定变量为这些父级类应用不同的样式。当不同模板共享相同的父级类名时,如何为它们应用独立的样式?
以下是我们试图实现的一个简化场景:
假设我的主题中,主题列表样式在 common/common.scss 中定义如下:
.topic-list {
tbody {
border: none;
}
tr {
border: none;
}
.example-div {
border: none;
}
}
而在我的变体中,我希望将其设置为:
.topic-list {
tbody {
display: block;
tr {
display: block;
}
}
.example-div {
border: 2px solid black;
}
.another-example-div {
font-size: 10px;
}
}
被覆盖的 Handlebars 文件如下所示:
javascripts/discourse/templates/list/custom-topic-list-item.hbr
<div class='example-div'>
Hello
</div>
javascripts/discourse/templates/list/variant-custom-topic-list-item.hbr
<div class='example-div'>
Hello,
<div class='another-example-div'>
Nice to meet you
</div>
</div>
topic-list 类名在 Discourse 组件中提及,但渲染后的结构如下:
<table class="topic-list">
<tr class="topic-list-item">
<div class='example-div'>
Hello
</div>
</tr>
</table>
我希望在头文件中根据用户 ID 渲染这些文件之一:
common/header.html
const { findRawTemplate } = require("discourse-common/lib/raw-templates");
const user_id = api.getCurrentUser().id
api.modifyClass('component:topic-list-item', {
renderTopicListItem() {
let template = findRawTemplate("list/custom-topic-list-item");
if (user_id % 2 === 0)
template = findRawTemplate("list/variant-custom-topic-list-item");
if (template) {
this.set("topicListItemContents", template(this).htmlSafe());
}
},
});
谢谢