2013-03-27 2 views
0

У меня возникла проблема с попыткой установить значения на мобильной странице перед переходом на эту страницу.Как обновить Beans или Scoped Variables при переходе в XPages Mobile Controls

У меня есть скриптовый блок, основанный на OpenNTF XSnippet Тони МакГаккина. http://openntf.org/XSnippets.nsf/snippet.xsp?id=calling-server-side-jscode-during-mobile-page-transitions

Поэтому, когда я перехожу на страницу с идентификатором «appPage3», я вызываю метод «facilityCheckIn», если служба JSON-RPC.

Я пытаюсь установить значение в управляемом компоненте viewScoped и для тестирования пытаюсь установить обычную переменную viewScope.

Насколько я могу судить, мобильная страница не подбирает изменения. Он вообще не показывает viewScope. Я не уверен, что с этим. Я считаю, что управляемый bean-компонент получает его значение, но это похоже на то, что страница сначала отображается. Значение на странице «Мобильный» пуст в первый раз , а затем, если я либо обновляюсь, либо выхожу и возвращаюсь на страницу, которую он отображает. Я попытался получить доступ к компоненту через SSJS и EL.

Мне действительно нужно иметь возможность устанавливать значения для мобильных страниц по мере перехода на страницу и из нее.

Любые советы будут оценены.

Спасибо!

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

Я создал 6-минутное видео, демонстрирующее проблему, и это также показывает весь соответствующий код.

http://traffic.libsyn.com/notesin9/SO-Question.mp4

Спасибо !!!

<xp:this.resources> 
    <xp:styleSheet href="/.ibmxspres/dojoroot/dijit/themes/tundra/tundra.css"></xp:styleSheet> 
    <xp:styleSheet href="/mobile.css"></xp:styleSheet> 
</xp:this.resources> 
<xc:ccDebugToolbar defaultCollapsed="false" 
    collapseTo="left"></xc:ccDebugToolbar> 
<xe:singlePageApp id="singlePageApp1" 
    selectedPageName="home"> 
    <xe:djxmHeading id="djxmHeading1" label="My Inventory"></xe:djxmHeading> 


    <xe:appPage id="homeID" pageName="home"> 
     <xe:djxmHeading id="djxmHeading2" label="My Inventory"> 
     </xe:djxmHeading> 

     <xc:mob_menu_home></xc:mob_menu_home> 
    </xe:appPage> 

    <xe:appPage id="appPage2" pageName="facility" resetContent="true"> 
     <xc:mob_menu_facility></xc:mob_menu_facility> 
    </xe:appPage> 

    <xe:appPage id="appPage8" pageName="show" resetContent="true"> 
     <xc:mob_menu_show></xc:mob_menu_show> 
    </xe:appPage> 


    <xe:appPage id="appPage3" pageName="facilityCheckIn" 
     resetContent="true"> 
     <xc:mob_page_CheckInOut header="Check In at Facility" 
      scanType="Receiving" scanLocation="Facility"> 
     </xc:mob_page_CheckInOut> 
    </xe:appPage> 

    <xe:appPage id="appPage5" pageName="facilityCheckOut" 
     resetContent="true"> 
     <xc:mob_page_CheckInOut header="Check Out from Facility" 
      scanType="Shipping" scanLocation="Facility"> 
     </xc:mob_page_CheckInOut> 
    </xe:appPage> 

    <xe:appPage id="appPage6" pageName="showCheckOut" 
     resetContent="true"> 
     <xc:mob_page_CheckInOut header="Check Out from Show" 
      scanType="Shipping" scanLocation="Show"> 
     </xc:mob_page_CheckInOut> 
    </xe:appPage> 

    <xe:appPage id="appPage7" pageName="showCheckIn" 
     resetContent="true"> 
     <xc:mob_page_CheckInOut header="Check In at Show" 
      scanType="Receiving" scanLocation="Show"> 
     </xc:mob_page_CheckInOut> 
    </xe:appPage> 


    <!-- SUB PAGES --> 

    <!-- GET MANIFEST Page --> 
    <xe:appPage id="appPage4" pageName="manifest" resetContent="true"> 
     <xc:mob_page_Manifest></xc:mob_page_Manifest> 
    </xe:appPage> 


</xe:singlePageApp> 


<xe:jsonRpcService id="jsonRpcService1" serviceName="appService"> 
    <xe:this.methods> 

     <xe:remoteMethod name="setCurrentPage"> 
      <xe:this.arguments> 
       <xe:remoteMethodArg name="pageName"></xe:remoteMethodArg> 
       <xe:remoteMethodArg name="direction"></xe:remoteMethodArg> 
      </xe:this.arguments> 
      <xe:this.script><![CDATA[print("PageName " + pageName); 
      print("Direction " + direction); 
      viewScope.put("vsPage", "test"); 
App.setCurrentPage(pageName); 
App.setCurrentDirection(direction); 
return "";]]></xe:this.script> 
     </xe:remoteMethod> 
    </xe:this.methods> 
</xe:jsonRpcService> 
<xp:br></xp:br> 
<xp:br></xp:br> 
<xp:br></xp:br> 

<xp:scriptBlock id="scriptBlock1"> 
    <xp:this.value><![CDATA[ 
     XSP.addOnLoad(function(){ 
      // Begin App Page 1 
      var newPage = dijit.byId("#{id:appPage3}"); 

      if(null != newPage){ 
       dojo.connect(newPage, "onBeforeTransitionIn", function(){ 
        var deferred = appService.setCurrentPage("facilityCheckIn", "onBeforeTransitionIn"); 
        deferred.addCallback(function(result) { 
         console.log(result); 
        }); 
       }); 
       dojo.connect(newPage, "onBeforeTransitionOut", function(){ 
        var deferred = appService.setCurrentPage("facilityCheckIn", "onBeforeTransitionOut"); 
        deferred.addCallback(function(result) { 
         console.log(result); 
        }); 
       }); 
       dojo.connect(newPage, "onAfterTransitionIn", function(){ 
        var deferred = appService.setCurrentPage("facilityCheckIn", "onAfterTransitionIn"); 
        deferred.addCallback(function(result) { 
         console.log(result); 
        }); 
       }); 
       dojo.connect(newPage, "onAfterTransitionOut", function(){ 
        var deferred =appService.setCurrentPage("facilityCheckIn", "onAfterTransitionOut"); 
        deferred.addCallback(function(result) { 
         console.log(result); 
        }); 
       }); 
      } 
      // End App Page 1 

      // Begin Home Page 

      var newPage = dijit.byId("#{id:homeID}"); 

      if(null != newPage){ 
       //console.log("Inside home Page") 
       dojo.connect(newPage, "onBeforeTransitionIn", function(){ 
        var deferred = appService.homePageReset(); 
        deferred.addCallback(function(result) { 
         console.log(result); 
        }); 
       }); 
       dojo.connect(newPage, "onBeforeTransitionOut", function(){ 
        var deferred = appService.homePageReset(); 
        deferred.addCallback(function(result) { 
         console.log(result); 
        }); 
       }); 
      } 
      // END Home Page 

     // Insert new Code ABOVE THIS LINE 
     }); // This ends the block that holds all the functions 
    ]]></xp:this.value> 
</xp:scriptBlock> 

+0

Я не вижу свой вызов в коде выше? Итак, предположим: RPC-вызов асинхронный, поэтому переход на новую страницу произошел до того, как результаты вернутся. И страница с переходом тоже не разговаривает с сервером. Мое понимание заключается в том, что в этом суть приложений с одной страницей: минимизировать трафик с/на сервер – stwissel

+0

Что вы пытаетесь сделать здесь? Или, скорее, как бы конечный пользователь описал поведение, если он сработал? JSON-RPC + dojo.connect - это ваш «Как» ... что твой «Что?» :) –

+0

Tim - Цель состоит в том, чтобы настроить виртуальную страницу при переходе на нее. Поэтому, если я перейду к настройке страницы, будут использоваться переменные bean или scoped, поэтому открываемая страница - using resetContent = true - может использовать любой из параметров. Например, кнопка «Назад» - я хотел бы вычислить это, чтобы перейти на первую страницу, которая может измениться. Только один пример. Я бы хотел много вычислить. –

ответ

0

Хорошо, я считаю, что я решил. Мне не повезло с использованием элементов управления RPC от XSnippet от Tony. Это работает, когда вы покидаете страницу, но не при входе. Кажется, это работает по своему желанию.

Чтобы иметь дело с вводом, вам нужно поместить свой код в событие Rendering заголовка.

+0

Примечание. Событие рендеринга будет срабатывать только при сбросе содержимого приложения. –

0

я столкнулся с подобной проблемой некоторое время назад, и мне пришлось создать еще одну XPage (с SingleApplication), чтобы перейти к вместо того, чтобы просто прыгать на appPage внутри то же SingleApplication.

Не идеально, однако, он также решил еще один вопрос для меня, так как я хотел, чтобы иметь возможность перейти непосредственно к странице в вопросе (с помощью QR-кода) .. ;-)

/John

PS. Следуйте своим выводам здесь, чтобы узнать, можно ли это сделать. Подобные проблемы с мобильным управлением (у меня были некоторые с typeahead) вроде как толкнули меня в направлении других фреймворков, пока что так или иначе ...

0

David .... Вы сказали, что делать обновление исправить проблему, также Стефан упомянул, что переход на новую страницу происходит до того, как результат вернется из RPC, который, по моему мнению, верен.Так что в вашем обратном вызове, а не оптимальны, но может, по крайней мере заставить вас двигаться вперед, вы могли бы выстрелить частичное обновление с помощью:

XSP.partialRefreshGet("#{id:appPage3}",{}); 
//I've had partial success with the "#{id:appPage3}" call, so I usually use a full 
// dojo query like: 
var appPageId = dojo.query("[id$='appPage3']")[0].id 

Я не знаю, если это будет исправить вашу проблему, но, похоже, все работает, как следует, за исключением того, что эта величина заселена.

+0

Keith - Отличная идея - но я не мог заставить это работать. Навигация сломался. –