动态修改 Topic List Item 的 style 属性

免责声明:对目前的发展方向非常满意,并感谢迄今为止所做的所有工作,因为新系统具有强大的功能。只需要确保我们保留一些等效的功能?…

在我的组件 TLP 中,我目前正在动态设置主题列表项外部标签的样式属性:

  • background: 颜色设置为唯一的 RGB 值,以匹配图像的主色调。这应该在 Ember 循环中完成。

我还设置 grid-row-end 来快速确定网格元素的尺寸。这非常快速且高效,并避免了大量 Javascript。但是,为此我使用了 Javascript,因为它依赖于 DOM 中的最终尺寸。

目前这些可以很好地共存。

image

<tr> style="background: rgb(56, 10, 58); grid-row-end: span 48;" data-topic-id="23321" id="ember168" class="topic-list-item category-uncategorized tag-inforunners visited white-text has-thumbnail tiles-grid-item ember-view" data-is-last-viewed-topic="true">

这些都是主题组件的关键自定义,没有它们,它将无法支持。

这种对样式的第一次修改目前是通过直接的样式属性绑定和 modifyClass 实现的,但我知道这是一个已弃用的方法。

在新环境中,能否为此提供 API?

或者,也许我错过了现有的方法?

然而,我认为这无法通过类来实现。

3 个赞

是吗?:confused: 这不仅仅是需要更新为原生类语法吗?

我将遵循这个

1 个赞

哦,我明白了。我以为那是指这次升级。

1 个赞

需要澄清几点。

  • modifyClass 是否仍然有效?(只是更新了语法——如果有效,最好引用该指南)
  • 我是否仍然可以使用它来访问封闭标签的 style 属性?

经典组件的不同之处在于,它们历来允许在模板之外访问封闭标签级别的属性,因此在代码中动态修改它们非常简单。

1 个赞

啊,你说得对。控制台中有一个已弃用的通知。

弃用通知:使用“modifyClass”修改“component:topic-list-item”已被弃用。请改用值转换器“topic-list-columns”和其他新的 topic-list 插件 API。

1 个赞

modifyClass 本身并未弃用。它是一种有风险的自定义方法,在使用时应采取预防措施(如 @don 链接的文档中所述),但我们目前没有立即移除它的计划。

我们打印 component:topic-listcomponent:topic-list-items 弃用消息的原因是,这些组件是主题列表的旧实现,在启用 Glimmer 主题列表时不会使用。现在,我们有一组 Glimmer 组件,例如 components/topic-list/item

因此,从技术上讲,您可以在这些新组件上使用 modifyClass。但是,由于它们是 Glimmer 组件,您将无法通过 JS 类修改样式标签,因此这无助于解决 OP 中的问题。

我们在官方的 d-topic-thumbnails 主题组件中有一个类似的“砌体”模式,所以值得看看它是如何实现的。我们为主题列表的每个“行”添加了一个唯一的类:

然后,我们在单独的 plugin-outlet 中渲染一个动态的 <style> 标签,该标签会定位这些类名:

话虽如此……这有点复杂,所以也许我们应该考虑添加一个特定的 valueTransformer 来允许更改 style= 属性。由于 Ember 对该属性的 xss/htmlSafe 保护,这有点棘手……但我相信我们可以让一些东西起作用。

3 个赞

谢谢你考虑,大卫,那将太好了!

大卫,我还有另一个问题,是否可以通过新 API 挂钩 Glimmer 事件,例如 didInsert、didUpdate、willDestroy?

例如,我想在 didInsert 上运行一些额外的 JavaScript,目前这是通过 @on 和 modifyClass 处理的。

(我很乐意为此创建一个新主题)

我现在将尝试你的技术:

1 个赞

我们可以在某些地方引入特定的转换器。但我认为我们不会添加一个通用的 API 来允许你挂钩到任何元素/组件。

至于 style= 属性的讨论,我创建了这个 PR。我会尝试让它被审查/合并:

3 个赞

谢谢。到目前为止,您的当前技术进展顺利,我已经为 TLP 定制了它,并且它似乎运行良好。如果我发现任何其他潜在的漏洞,我会恢复。

太棒了!等它合并的时候我应该就准备好了,我很期待!谢谢 David!

3 个赞

效果很_好_,再次感谢! :rocket:

2 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.