wicket Head渲染顺序

wicket Head rendering order

我有 Wicket 应用程序。我想在 Page js 之后呈现一些 Panel js 代码。 将 JS 渲染到 pagee 我使用 renderHead 方法。

@Override
public void renderHead(IHeaderResponse response) {
    response.render(JavaScriptReferenceHeaderItem.forReference(new JavaScriptResourceReference(BasePage.class, "assets/js/core/jquery.min.js")));
    super.renderHead(response);

    response.render(JavaScriptReferenceHeaderItem.forReference(new JavaScriptResourceReference(BasePage.class, "assets/js/core/popper.min.js")));
    response.render(JavaScriptReferenceHeaderItem.forReference(new JavaScriptResourceReference(BasePage.class, "assets/js/core/bootstrap.min.js")));
    response.render(JavaScriptReferenceHeaderItem.forReference(new JavaScriptResourceReference(BasePage.class, "assets/js/core/jquery.slimscroll.min.js")));
    response.render(JavaScriptReferenceHeaderItem.forReference(new JavaScriptResourceReference(BasePage.class, "assets/js/core/jquery.scrollLock.min.js")));
    response.render(JavaScriptReferenceHeaderItem.forReference(new JavaScriptResourceReference(BasePage.class, "assets/js/core/jquery.appear.min.js")));
    response.render(JavaScriptReferenceHeaderItem.forReference(new JavaScriptResourceReference(BasePage.class, "assets/js/core/jquery.countTo.min.js")));
    response.render(JavaScriptReferenceHeaderItem.forReference(new JavaScriptResourceReference(BasePage.class, "assets/js/core/js.cookie.min.js")));
    response.render(JavaScriptReferenceHeaderItem.forReference(new JavaScriptResourceReference(BasePage.class, "assets/js/codebase.js")));
}

还想在面板上添加一些面板相关的代码

@Override
public void renderHead(IHeaderResponse response) {
    super.renderHead(response);
    response.render(JavaScriptReferenceHeaderItem.forReference(new JavaScriptResourceReference(CompanySignUpPanelStep23.class, "CompanySignUpPanelStep23.js")));
}

panel js依赖jQuery页面渲染

看起来 wicket 使用 internalRenderHead 渲染它,首先渲染 Childs,然后渲染 Own Head。

/**
 * THIS METHOD IS NOT PART OF THE WICKET PUBLIC API. DO NOT USE IT.
 * 
 * Print to the web response what ever the component wants to contribute to the head section.
 * Make sure that all attached behaviors are asked as well.
 * <p>
 * NOT intended for overriding by framework clients. Rather, use
 * {@link Component#renderHead(org.apache.wicket.markup.head.IHeaderResponse)}
 * </p>
 * 
 * @param container
 *            The HtmlHeaderContainer
 */
public void internalRenderHead(final HtmlHeaderContainer container)
{
    if (isVisibleInHierarchy() && isRenderAllowed())
    {
        if (log.isDebugEnabled())
        {
            log.debug("internalRenderHead: {}", toString(false));
        }

        IHeaderResponse response = container.getHeaderResponse();

        // Allow component to contribute
        if (response.wasRendered(this) == false)
        {
            StringResponse markupHeaderResponse = new StringResponse();
            Response oldResponse = getResponse();
            RequestCycle.get().setResponse(markupHeaderResponse);
            try
            {
                // Make sure the markup source strategy contributes to the header first
                // to be backward compatible. WICKET-3761
                getMarkupSourcingStrategy().renderHead(this, container);
                CharSequence headerContribution = markupHeaderResponse.getBuffer();
                if (Strings.isEmpty(headerContribution) == false)
                {
                    response.render(StringHeaderItem.forString(headerContribution));
                }
            }
            finally
            {
                RequestCycle.get().setResponse(oldResponse);
            }
            // Then let the component itself to contribute to the header
            renderHead(this, response);

            response.markRendered(this);
        }

        // Then ask all behaviors
        for (Behavior behavior : getBehaviors())
        {
            if (isBehaviorAccepted(behavior))
            {
                if (response.wasRendered(behavior) == false)
                {
                    behavior.renderHead(this, response);
                    List<IClusterable> pair = Arrays.asList(this, behavior);
                    response.markRendered(pair);
                }
            }
        }
    }
}

有什么方法可以确定顺序吗?

您应该改用 Wicket HeaderItem/ResourceReference 依赖项。

你的 JavaScriptResourceReference for Panel.js 应该覆盖它的 #getDependencies() 方法和 return 包含 ResourceReference for jQuery.jsList ].这样每个资源都将声明其依赖项,Wicket 将以正确的顺序呈现它们。

例如参见WicketAjaxJQueryResourceReference