代码之家  ›  专栏  ›  技术社区  ›  Yevgen Kulik

导叶头部渲染顺序

  •  0
  • Yevgen Kulik  · 技术社区  · 7 年前

    我有Wicket申请表。我想在页面js之后呈现一些面板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")));
    }
    

    面板js依赖于页面呈现的jQuery。

    看起来像wicket使用internalRenderHead渲染它,其中首先渲染Childs,然后渲染自己的头部。

    /**
     * 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);
                    }
                }
            }
        }
    }
    

    有没有办法确定订单?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Rob Audenaerde    7 年前

    你应该使用Wicket HeaderItem /而不是资源引用依赖项。

    你的 JavaScriptResourceReference 对于 Panel.js 应覆盖其 #getDependencies() 方法并返回一个 List 包含 ResourceReference 对于 jQuery.js . 这样,每个资源将声明其依赖项,Wicket将以正确的顺序呈现它们。

    看见 WicketAjaxJQueryResourceReference 例如