如何在XPage Mobile Controls中转换时更新Bean或Scoped变量

时间:2013-03-27 00:36:48

标签: xpages xpages-extlib

在转换到该页面之前尝试在移动页面上设置值时遇到问题。

我有一个基于Tony McGuckin的OpenNTF XSnippet的脚本块。 http://openntf.org/XSnippets.nsf/snippet.xsp?id=calling-server-side-jscode-during-mobile-page-transitions

因此,当我转换到ID为“appPage3”的页面时,如果是JSON-RPC服务,我会调用方法“facilityCheckIn”。

我正在尝试在viewScoped托管bean中设置值,并尝试设置正常的viewScope变量进行测试。

尽管我可以说移动页面没有发现变化。它根本没有显示viewScope。我不确定那是怎么回事。 我相信托管bean正在获得它的价值,但它就像页面首先被渲染一样。第一次移动页面上的值为空白 然后,如果我刷新,或退出并返回到它显示的页面。我尝试通过SSJS和EL访问bean。

我真的需要能够在移入和移出页面时为移动页面设置值。

任何建议都将受到赞赏。

谢谢!

我已更新以下代码以显示完整的移动网页。我没有为应该显示字段的自定义控件添加任何内容,但如果需要可以。

我创建了一个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>

3 个答案:

答案 0 :(得分:0)

前段时间我遇到过类似的问题,我不得不创建另一个XPage(使用SingleApplication)导航到而不是只跳转到同一个SingleApplication中的appPage。

不理想,但它也为我解决了另一个问题,因为我希望能够直接跳转到相关页面(使用QR码)..; - )

/约翰

PS。将在此处跟踪您的发现,看看是否可以完成。移动控件的这种问题(我有一些类型也有类型)推动了我对其他框架的指导,不管怎样,现在......无论如何...

答案 1 :(得分:0)

David ....你说刷新确实解决了这个问题,Stephan也提到过,在结果从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

我不知道这是否会纠正您的问题,但看起来一切正常,但正在填充的值除外。

答案 2 :(得分:0)

好的,我相信我已经解决了这个问题。我没有运气使用Tony的XSnippet中的RPC控件。那是你离开页面的作品,但如果你进入则不行。这似乎符合要求。

要处理输入,您需要将代码放在标题的Rendering事件中。