1

我将从一个示例开始,如果我有 2 个这样的面板:

<h:panelGroup id="container">
  <!-- PANEL 1 -->
  <c:if test=#{bean.render1}>
    <ui:include ... />
  </c:if>

<!-- PANEL 2 -->
  <c:if test=#{bean.render2}>
    <ui:include ... />
  </c:if>
</h:panelGroup>

面板 2 有一个“p:fileupload”组件,默认情况下,当页面加载时会显示面板 1,当我更改为面板 2 时,会发送一个 ajax 请求以更新“容器”,但由于此代码我得到一个异常:

createWidget : function(widgetConstructor, widgetVar, cfg, resource) { 
  if(PrimeFaces.widget[widgetConstructor]) {
    //...
  } else {
    var scriptURI = $('script[src*="/javax.faces.resource/primefaces.js"]').attr('src').replace('primefaces.js', resource + '/' + resource + '.js'),
        cssURI = $('link[href*="/javax.faces.resource/primefaces.css"]').attr('href').replace('primefaces.css', resource + '/' + resource + '.css'),
        cssResource = '<link type="text/css" rel="stylesheet" href="' + cssURI + '" />';
    //...
  }
}

你怎么能猜到,一些组件(当我使用 c:if 或使用 pe:ckEditor 时)加载额外的库而不使用 @ResourceDependency 注释,在这种情况下我会得到一个异常,因为资源“primefaces.js”不存在,被全脸取代。

有什么建议可以解决这个问题吗?

4

1 回答 1

1

为了解决这个设计问题,有 3 个选项:

  1. 不要使用 ajax 来导航,而是使用普通的(并且可书签和 SEO 友好的)请求。

  2. 不要将视图构建时间标签用于基于请求的渲染(通过 ajax),而是使用rendered属性。

  3. 使用 . 明确包括自己缺少的资源<h:outputScript>。例如<p:fileUpload>

    <h:outputScript library="primefaces" name="fileupload/fileupload.js" target="head" />
    
于 2014-05-29T04:24:25.750 回答