CUBA平台如何动态改变字段颜色

CUBA platform how to dynamically change field color

我正在尝试在某些字段颜色因某些处理而改变时动态更改它。

CUBA 文档解释了如何通过 Web 主题扩展 (https://doc.cuba-platform.com/manual-6.2/web_theme_extension.html), but not dynamically. Although it is possible in Vaadin (https://vaadin.com/wiki/-/wiki/Main/Dynamically%20injecting%20CSS) 静态地完成此操作,Web 图形用户界面建立在该平台上。

我想如果我使用 Vaadin 注入方式 CSS 它会起作用(我会尝试)但是我将拥有 Vaadin 特定代码,我试图避免这种情况。

有没有 CUBA 方法可以做到这一点?

编辑:

我正在尝试让表单的任何字段在其初始值发生变化时更改背景颜色。根据 CUBA 文档 (https://doc.cuba-platform.com/manual-6.2/web_theme_extension.html),我需要: - 创建一个带有背景颜色的 SCSS 混入 - 在编辑器中插入字段 class 以便访问它 - 对字段更改事件做出反应,然后定义字段的样式名称

我确实创建了 SCSS mixin,但我有两个问题: 1)我想动态检索字段实例而不是注入它(保持代码干净轻便) 2) 我想避免静态定义背景颜色,以便可以在运行时参数化颜色

对于 1) 我尝试注入 fieldGroup 并使用 getFieldComponent(),然后在更改时应用带有 setStyleName 的样式。它有效,但我更愿意为作为输入字段的每个字段定义此行为。

对于 2)除了使用 Vaadin 特定的注入功能 CSS(并将我的代码绑定到 Vaadin(从而使我远离通用接口)之外,我不知道该怎么做

希望更清楚

您无法从代码到字段设置真正的动态颜色(任何 RGBA),但您可以为您的字段创建许多预定义颜色:

@import "../halo/halo";

@mixin halo-ext {
  @include halo;

  .v-textfield.color-red {
    background: red;
  }
  .v-textfield.color-blue {
    background: blue;
  }
  .v-textfield.color-green {
    background: green;
  }
}

我不建议使用从代码注入的样式(如 Vaadin Page 所做的那样),因为它是逻辑和表示的混合体。相反,您可以创建所有预定义样式(30-50 种样式应该足够了)并使用 setStyleName 方法根据某些条件分配它:

public class ExtAppMainWindow extends AppMainWindow {
    @Inject
    private TextField textField;

    private int steps = 0;

    public void changeColor() {
        if (steps % 2 == 0) {
            textField.setStyleName("color-red");
        } else {
            textField.setStyleName("color-blue");
        }
        steps++;
    }
}

如果您想对 FieldGroup 内的所有 TextField 应用颜色更改逻辑,您可以按以下方式迭代 FieldGroup 字段:

for (FieldGroup.FieldConfig fc : fieldGroup.getFields()) {
    Component fieldComponent = fieldGroup.getFieldComponent(fc);
    if (fieldComponent instanceof TextField) {
        TextField textField = (TextField) fieldComponent;
        textField.addValueChangeListener(e -> 
                textField.setStyleName("color-red")
        );
    }
}