3

我使用 Maven 创建了一个新的 Tapestry 5.3 项目。我注意到 Tapestry 向所有页面添加了大量不同的 JS 和 CSS 文件:

<link type="text/css" rel="stylesheet" href="/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/default.css"/>
<link type="text/css" rel="stylesheet" href="/tutorial1/assets/1.0-SNAPSHOT-DEV/ctx/layout/layout.css"/>
<link type="text/css" rel="stylesheet" href="/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/tapestry-console.css"/>
<link type="text/css" rel="stylesheet" href="/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/t5-alerts.css"/>
<link type="text/css" rel="stylesheet" href="/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/tree.css"/>
<script src="/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/underscore_1_3_3.js" type="text/javascript"></script>
<script src="/tutorial1/assets/1.0-SNAPSHOT-DEV/tapestry/scriptaculous_1_9_0/prototype.js" type="text/javascript"></script>

还有很多很多...

这些是我的网站正常工作所必需的吗?如果没有,我该如何删除它们?我自己写 JS 很舒服,我不需要 Tapestry 为我添加任何东西。

4

2 回答 2

5

有趣的是:Tapestry 提供了非常丰富的功能来覆盖默认服务行为,但在这种情况下却没有。罪魁祸首 JavaScriptSupport 是动态创建的,无法修饰。

MarkupRendererFilter javaScriptSupport = new MarkupRendererFilter() {
        public void renderMarkup(MarkupWriter writer, MarkupRenderer renderer) {
            DocumentLinker linker = environment.peekRequired(DocumentLinker.class);
            //Surprise!;) 
            JavaScriptSupportImpl support = new JavaScriptSupportImpl(linker, javascriptStackSource, javascriptStackPathConstructor);
            environment.push(JavaScriptSupport.class, support);
            renderer.renderMarkup(writer);
            environment.pop(JavaScriptSupport.class);
            support.commit();
        }
    };

因此,唯一的方法是修补源(就像我们多次所做的那样),或者尝试覆盖作为 JavaScriptSupportImpl 的参数的 javascriptStackSource:

你的 AppModule.java

@Decorate(serviceInterface = JavaScriptStackSource.class)
public JavaScriptStackSource decorateJavaScriptStackSource(JavaScriptStackSource original) {
    return new MyJavaScriptStackSource(original);
}

MyJavaScriptStackSource.java

public class MyJavaScriptStackSource implements JavaScriptStackSource {
// This bunch of stacks comes from got5
private Set<String> SKIP = new HashSet<String>(Arrays.asList("Slider", "AjaxUploadStack", "DataTableStack", "FormFragmentSupportStack", "FormSupportStack",
        "SuperfishStack", "JQueryDateFieldStack", "GalleryStack"));

private class JavaScriptStackWraper implements JavaScriptStack {
    private final JavaScriptStack original;

    JavaScriptStackWraper(JavaScriptStack original) {
        if (original != null) {
            System.out.println("Wrap " + original.getClass().getName());
        }
        this.original = original;
    }

    @Override
    public List<String> getStacks() {
        return original != null ? original.getStacks() : Collections.<String>emptyList();
    }

    @Override
    public List<Asset> getJavaScriptLibraries() {
        return original != null ? original.getJavaScriptLibraries() : Collections.<Asset>emptyList();
    }

    // Always return empty list
    @Override
    public List<StylesheetLink> getStylesheets() {
        return Collections.<StylesheetLink>emptyList();
    }

    @Override
    public String getInitialization() {
        return original != null ? original.getInitialization() : null;
    }
}

private final JavaScriptStackSource original;

public MyJavaScriptStackSource(JavaScriptStackSource original) {
    this.original = original;
}

@Override
public JavaScriptStack getStack(String name) {
    JavaScriptStack stack = original.getStack(name);
    if (!SKIP.contains(stack.getClass().getSimpleName())) {
        return new JavaScriptStackWraper(stack);
    }
    return new JavaScriptStackWraper(null);
}

@Override
public List<String> getStackNames() {
    return original.getStackNames();
}

}

这是一大段糟糕的代码,但它可以工作。我希望更好地控制我在 Tapestry 中的页面中显示的内容。

于 2013-06-10T20:38:33.320 回答
1

Tapestry 的部分优势在于提供开箱即用的 DHTML 和 Ajax 行为的组件数量,无需编写任何 JavaScript,而只需配置组件。

可以禁用此功能,但这意味着您可能喜欢使用的许多组件(例如 Zone)将被破坏。同样,所有客户端输入验证都将消失。我确实有客户这样做过,但这不是一件小事。

基本上,您可以覆盖 Tapestry 的“核心”JavaScriptStack。对此没有常见问题解答,因为它不经常被问到。它也不适合绝对的初学者,更多的是熟练的东西(在 Tapestry 中覆盖东西相对容易,因为它的控制容器反转,但知道要覆盖的内容更棘手)。

无论如何,Tapestry 5.4 正在顺利进行,并且正在将 Tapestry 的 JavaScript 更改为更轻量级和更模块化,并让您在 Prototype(主要是为了与现有 Tapestry 项目的兼容性)或 jQuery 之间进行选择。然而,即便如此,框架中也会内置一些 JavaScript。

于 2012-10-23T01:01:18.390 回答