- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有一个 Web 应用程序,它需要为每个主要客户提供不同的主题。最初的开发人员通过查看 javascript 中的 URL 并添加样式表来覆盖默认主题来做到这一点。
这样做的一个问题是该站点具有几秒钟的默认外观,然后突然切换到正确的主题。另一个是它似乎浪费了大量的带宽/时间。
我目前的想法是创建一个“默认”ClientBundle使用我们的默认外观扩展该界面并使用客户端图像覆盖每个条目(根据需要),使用各种注释(如@ImageResouce)并指向不同的位置。
有没有人有这样做的经验?我预见到的一个问题是无法使用 uibinder 样式标签,因为它们静态指向特定的资源包。
有任何想法吗?
最佳答案
被覆盖的包
是的你可以。
我已经用 ClientBundles 做了覆盖的事情并且工作正常。您必须做的一件事是也继承属性的类型。举例:
BigBundle {
Nestedundle otherBundle();
ImageResource otherImage();
Styles css();
}
OtherBigBundle extends BigBundle {
OtherNestedBundle otherBundle(); // if you want to change it
ImageResource otherImage(); // of you want to change it
OtherStyles css(); // of you want to change it
}
OtherNestedBundle extends NestedBundle
和
OtherStyles extends Styles
UiField(provided=true)
,则可以从捆绑包外部设置使用注解。这样,您首先设置捆绑包,然后调用 uibindler。假设它已经创建,它将使用资源字段。
<ui:with field='res' type='your.package.TheBundle'/>
@UiField(provided=true) TheBundle bundle;
private void createTheThing() {
this.bundle = factory.createBundle();
MyUiBindler binder = GWT.create(MyUiBindler.class);
this.panel = binder.createAndBindUi(this);
...
}
interface TheBundle extends ClientBundle {
@ImageResource("default.png")
ImageResource image1();
@Source("default.css")
TheCss css();
}
interface Theme1Bundle extends TheBundle {
@ImageResource("one.png")
ImageResource image1(); // type: imageresource is ok
@Source("one.css")
OneCss css(); // type: OneCss => use other compiled css class-names
interface OneCss extends TheCss { // inner-interface, just for fun
// don't need to declare each String method
}
}
if (...) {
return GWT.create(TheBundle.class);
} else if (...) {
return GWT.create(Theme1Bundle.class);
}
if (...) {
GWT.runAsync(new RunAsyncCallback() {
public void onSuccess() {
return GWT.create(TheBundle.class);
}
// please program the onFailure method
});
} else if (...) {
GWT.runAsync(new RunAsyncCallback() {
public void onSuccess() {
return GWT.create(Theme1Bundle.class);
}
// please program the onFailure method
});
}
@ThemeBundle("one")
)自动生成工厂
public interface DynamicEntryPointWidgetFactory
{
public void buildWidget(String widgetName, AsyncCallback<Widget> callback);
}
@Target(ElementType.TYPE)
public @interface EntryPointWidget
{
/**
* The name wich will be used to identify this widget.
*/
String value();
}
<generate-with class="com.dia.nexdia.services.gwt.rebind.entrypoint.DynamicEntryPointFactoryGenerator">
<when-type-assignable class="com.dia.nexdia.services.gwt.client.entrypoint.DynamicEntryPointWidgetFactory" />
</generate-with>
public class DynamicEntryPointFactoryGenerator extends Generator {
@Override
public String generate(TreeLogger logger, GeneratorContext context,
String typeName) throws UnableToCompleteException {
PrintWriter pw = context.tryCreate(logger,
"x.services.gwt.client.entrypoint",
"DynamicEntryPointWidgetFactoryImpl");
if (pw != null) {
// write package, imports, whatever
pw.append("package x.services.gwt.client.entrypoint;");
pw.append("import x.services.gwt.client.entrypoint.DynamicEntryPointWidgetFactory;");
pw.append("import com.google.gwt.core.client.GWT;");
pw.append("import com.google.gwt.core.client.RunAsyncCallback;");
pw.append("import com.google.gwt.user.client.rpc.AsyncCallback;");
pw.append("import com.google.gwt.user.client.ui.Widget;");
// the class
pw.append("public class DynamicEntryPointWidgetFactoryImpl implements DynamicEntryPointWidgetFactory {");
// buildWidget method
pw.append(" public void buildWidget(String widgetName, final AsyncCallback<Widget> callback) {");
// iterates over all the classes to find those with EntryPointWidget annotation
TypeOracle oracle = context.getTypeOracle();
JPackage[] packages = oracle.getPackages();
for (JPackage pack : packages)
{
JClassType[] classes = pack.getTypes();
for (JClassType classtype : classes)
{
EntryPointWidget annotation = classtype.getAnnotation(EntryPointWidget.class);
if (annotation != null)
{
String fullName = classtype.getQualifiedSourceName();
logger.log(TreeLogger.INFO, "Entry-point widget found: " + fullName);
pw.append("if (\"" + annotation.value() + "\".equals(widgetName)) {");
pw.append(" GWT.runAsync(" + fullName + ".class, new RunAsyncCallback() {");
pw.append(" public void onFailure(Throwable t) {");
pw.append(" callback.onFailure(t);");
pw.append(" }");
pw.append(" public void onSuccess() {");
pw.append(" callback.onSuccess(new " + fullName + "());");
pw.append(" }");
pw.append(" });");
pw.append(" return;");
pw.append("}");
}
}
}
pw.append("callback.onFailure(new IllegalArgumentException(\"Widget '\" + widgetName + \"' not recognized.\"));");
pw.append(" }");
pw.append("}");
context.commit(logger, pw);
}
// return the name of the generated class
return "x.services.gwt.client.entrypoint.DynamicEntryPointWidgetFactoryImpl";
}
关于gwt - ClientBundle 为多个 "themes",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5709298/
在我的应用程序中,我有 MyAppResources,其中主要包含应用程序的自定义样式。我正在考虑将自定义样式应用于标准小部件(例如 CellTable)以及布局和自定义小部件上的自定义样式的好方法是
我最近读过this article在 ClientBundle 和杠杆和旋钮部分下,查看这两个条目: ClientBundle.enableInlined 是一个延迟绑定(bind)属性,可用于禁止在
我有一个客户端包: public interface FirstClientBundle extends ClientBundle { public static final FirstClien
我们正在使用 GWT 构建一个大型企业应用程序(数十个模块),需要决定是否使用 ClientBundle。我很好奇 StackOverflow GWT 社区对于这种用例的交易制定者和交易破坏者的看法是
我们有一个 Web 应用程序,它需要为每个主要客户提供不同的主题。最初的开发人员通过查看 javascript 中的 URL 并添加样式表来覆盖默认主题来做到这一点。 这样做的一个问题是该站点具有几秒
我试图更好地理解 GWT ClientBundle 和缓存的使用。 例如,如果我有一个大型文本文件,我想向我的客户提供该文件,我可以使用 public interface MyResources ex
我是 GWT 新手,很难理解模块和ClientBundle之间的根本区别。在 GWT 文档的某些区域中,两者似乎是同一件事,而在其他区域中,显然它们并不相同。 我的理解是,模块是部署到用户浏览器的客户
我尝试使用 ClientBundle 实现将我的图像管理到一个大文件并最小化 HTTP 请求。 我放入了 gwt.xml 生成ClientBundle 公共(public)接口(interface)R
我想将我的静态资源保留在类树之外,但将它们放在 src/main/resources 树中。尽管应该使用与 java 类相同的路径找到它们,例如: 打包我的.path.to; class Resour
在我的 GWT 大型项目中,我的图像资源有一个 ClientBundle。我在里面定义了大约 40 个 GIF 文件。 (每个文件大小约5KB) 然后我创建一个带有静态方法的类,将正确的图像设置为作为
我正在尝试使用 GWT 中的 ClientBundle 来加载消息。 这是我的代码:gwt.xml
我是 Google Web Toolkit 的新手,正在尝试将 ClientBundle 与 jquery-ui 结合使用。我的元素结构如下所示: 我定义了一个这样的资源接口(interface):
这个问题最好用一个例子来描述。 我的 GWT 应用程序中有以下 ClientBundle: interface Resources extends ClientBundle { public
我也是全新的GWT,无论我读了多少official doc on ClientBundles我似乎无法理解它们是什么以及它们做什么。对于 CssResource、DataResource、TextRe
我有一个 ClientBundle,它定义了一堆 TextResource 和 ImageResource 元素。 对于我网站上的每个页面,我计划设置一个代码拆分点,它将只运行该给定页面的 View
我是第一次使用 GWT ClientBundle。我编写了扩展它的接口(interface),代码如下: package edu.etf.fuzzy.client.login; import com.
我有一个包含整个应用程序所需的 css 资源的 ClientBundle - 默认背景颜色、常见布局模式等。 一个声明 design goal来自 GWT 的是“让多个 ClientBundle 资源
我有一个 GWT 问题, 我正在尝试将我的 css 移动到 ClientBundle 作为 CssResource,因为它声称这是最佳实践,但是有一个问题。它确实适用于 element-ID 和 el
我有一个与调用特定方法相关的 String 属性。 我有这个 DTO,有一个图标属性 public class MyDto { String icon; // "first", "second
默认情况下,IE9 不打印背景图像。是否有一个选项可以告诉 ClientBundle,所有图像都应该是真实元素而不是伪造的 css 背景图像? 最佳答案 这取决于ClientBundle如何生成,以及
我是一名优秀的程序员,十分优秀!