2016-10-27 3 views
1

Я использую плагин jQuery dataTables с xpages и имею пользовательский элемент управления, который я бросаю на любую страницу, передаю пользовательское свойство viewName и отображает таблицу с использованием REST - All на основе некоторых замечательных примеров Оливер Буссе.Xpages & DataTables

Все работает отлично, если этот настраиваемый элемент управления используется на основной странице, однако, если он находится на вкладке, которая не является по умолчанию, когда я затем нажимаю на вкладку, содержащую элемент управления, я получаю сообщение об ошибке при вызове viewjson.getId()

Я думаю, проблема в том, что я установил viewjson на beforePageLoad?

Любая идея, как я могу заставить это работать в интерфейсе с вкладками?

код ниже:

<xp:this.beforePageLoad><![CDATA[#{javascript:var viewjson = new org.openntf.rest.DynamicView(compositeData.viewName);}]]></xp:this.beforePageLoad> 
    <table 
     id="#{javascript:viewjson.getId()}" 
     class="table table-hover table-striped"> 
     <thead> 
      <xp:repeat id="repeat1" rows="30" disableOutputTag="true" 
       var="col"> 
       <xp:this.value><![CDATA[#{javascript:try { 
viewjson.getCols()} 
catch (e) { 
openLogBean.addError(e,this) 
}}]]></xp:this.value> 
       <th> 
        <xp:text escape="true" disableTheme="true" 
         value="#{col}"> 
        </xp:text> 
       </th> 
      </xp:repeat> 
     </thead> 
     <tbody></tbody> 
    </table> 

UPDATE

Я попытался следующие, чтобы попытаться загрузить JQuery первый

<xp:this.resources> 
<xp:headTag 
      tagName="script"> 
      <xp:this.attributes> 
       <xp:parameter 
        name="type" 
        value="text/javascript" /> 
       <xp:parameter 
        name="src" 
        value="/xsp/.ibmxspres/.extlib/responsive/jquery/jquery.min.js" /> 
      </xp:this.attributes> 
     </xp:headTag> 
     </xp:this.resources> 

А также это в свойствах Хр

xsp.client.script.dojo.djConfig="dojo-amd-factory-scan": false 

Но я все еще получаю пустую страницу без элементов dojo, отображающих

+0

Используйте этот XSnippet для обработки проблемы загрузчика AMD: https://openntf.org/XSnippets.nsf/snippet.xsp?id=hack-to-use-jquery-amd-widgets-and-dojo-together –

ответ

1

Событие пользовательского контроля beforePageLoad выполняется, когда XPage уже загружен.
Когда позже активируется вкладка, а вместе с ней отображается таблица, переменная viewjson ушла.

. Один из подходов состоит в том, чтобы поместить объект Java в составную переменную данных compositeData.viewjson в beforePageLoad и использовать ее в таблице позже. Но вы бы вычислили все просмотров для каждой вкладки перед отображением страницы. Кроме того, этот класс не является сериализуемым и не может быть сохранен в составной переменной данных. Однако вы можете сделать класс сериализуемым.

Лучше подход для создания экземпляра Java-бина в таблице - без события beforePageLoad:

<?xml version="1.0" encoding="UTF-8"?> 
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"> 
    <table 
     id="#{javascript: 
      var viewjson = new org.openntf.rest.DynamicView(compositeData.viewName); 
      return viewjson.getId(); 
     }"> 
     <thead> 
      <xp:repeat id="repeat1" rows="30" disableOutputTag="true" 
       var="col" value="#{javascript: viewjson.getCols()}"> 
       <th> 
        <xp:text escape="true" disableTheme="true" value="#{col}"> 
        </xp:text> 
       </th> 
      </xp:repeat> 
     </thead> 
     <tbody></tbody> 
    </table> 
</xp:view> 

Я проверил пользовательский контроль над (ccView со свойством VIEWNAME) с этим XPage

<?xml version="1.0" encoding="UTF-8"?> 
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xe="http://www.ibm.com/xsp/coreex" 
    xmlns:xc="http://www.ibm.com/xsp/custom"> 
    <xp:br /> 
    <xp:panel id="tabs"> 
     <xe:djTabContainer id="tabContainer" 
      selectedTab="djTabPane1" defaultTabContent="one"> 
      <xe:djTabPane id="djTabPaneView" title="one" closable="false" 
       partialRefresh="true"> 
       tab rendered first 
      </xe:djTabPane> 
      <xe:djTabPane id="djTabPane2" title="two" closable="false" 
       partialRefresh="true"> 
       <xc:ccView viewName="ByCity" /> 
      </xe:djTabPane> 
      <xe:djTabPane id="djTabPane3" title="three" closable="false" 
       partialRefresh="true"> 
       <xc:ccView viewName="ByName" /> 
      </xe:djTabPane> 
     </xe:djTabContainer> 
    </xp:panel> 
</xp:view> 

Представления во вкладках «два» или «три» загружаются в службы REST, когда пользователь нажимает соответствующую вкладку.

+0

Привет Кнут, спасибо за это , Я действительно попробовал второй подход, прежде чем я разместил вопрос о Stack, но он, похоже, не работал. Я даже установил переменную viewScope с viewjson.getID(), чтобы удостовериться, что он что-то возвращал правильно, что это было, но у меня все еще есть ошибка ....... Я немного повторю это позже утро, возможно, что я оставил некоторые старые биты в моем коде где-нибудь .... Я снова получаю обратную связь немного позже, приветствия –

+0

Хорошо, это работает с одним экземпляром моего настраиваемого элемента управления на одной вкладке, однако, если я иметь один элемент управления cusotm на одной вкладке, затем другой настраиваемый элемент управления на другой вкладке, указывая на разные виды, я получаю следующую ошибку: Предупреждение DataTables: таблица id = UKDE-AF6CY3 - запрошенный неизвестный параметр «3» для строки 0. Это сообщение появляется дважды .... Может ли он создать тот же идентификатор для обоих экземпляров таблицы в пользовательских элементах управления? –

+0

Кроме того, переход с использованием метода bean не работает .... Ошибка com.ibm.xsp.FacesExceptionEx: Не сериализуема: class org.openntf.rest.DynamicView ([email protected]) Кроме того, FYI , второй вариант не работает, я получаю ajax-ошибку, однако, если я оставлю beforePageLoad внутри, его работы, но затем дайте мне ошибку, упомянутую выше .... –

2

Я считаю, что основная проблема заключается в том, что для элемента управления XPages неактивная вкладка фактически не отображается браузеру до тех пор, пока она не станет активной. Итак, то, что вы вызвали в beforePageLoad(), искало контент, которого в то время не существовало. Возможно, есть вещь CSJS, которая может перезапустить таблицы данных. Другой вариант - не использовать элемент управления основной вкладкой, а использовать версию dojo из ext. библиотека. Я уверен, что версия dojo отображает весь контент и просто использует CSS для скрытия неактивных вкладок.

+0

Приветствия Дэвид, у меня было ощущение, что это связано с тем, что вкладки не отображают вещи до активных.Я не уверен, что хочу идти по маршруту додзё, так как одним сценарием может быть любое количество вкладок, каждое из которых содержит свое собственное представление, и если все будет отображаться вместе, время загрузки станет проблемой –

Смежные вопросы