1

ダウンタイムの後、私は再びいくつかの xpages を行っていますが、すでに多くのことを忘れているようです。次のコードがあります。

データソース:

<xe:objectData var="league" ignoreRequestParams="true" scope="request">
    <xe:this.saveObject><![CDATA[#{javascript:leagueService.set(league)}]]></xe:this.saveObject>
    <xe:this.createObject><![CDATA[#{javascript:return leagueService.get(viewScope.currentKey);}]]></xe:this.createObject>
</xe:objectData>

そしていくつかのコンボボックス

    <xp:comboBox id="idLeagueList" value="#{viewScope.currentKey}">
        <xp:selectItems>
            <xp:this.value><![CDATA[#{javascript: return eu.jeroensomhorst.cms.util.JSFUtil.asSelectItem(leagueService.getAll(season),true);}]]></xp:this.value>
        </xp:selectItems>   
        <xp:eventHandler event="onchange" submit="true" refreshMode="complete"></xp:eventHandler>
    </xp:comboBox>

    <xp:listBox id="lstAvailableTeams">
        <xp:selectItems>
            <xp:this.value><![CDATA[#{javascript:eu.jeroensomhorst.cms.util.JSFUtil.asSelectItem(teamService.getAll());}]]></xp:this.value>
        </xp:selectItems>
    </xp:listBox>

lstAvailableTeams で選択したチームを選択したリーグ オブジェクトに追加するボタン

    <xp:button value="&#62;" id="addTeam" >
                <xp:eventHandler event="onclick" submit="true" refreshMode="complete" disableValidators="true">
                    <xp:this.action>
                        <xp:actionGroup>
                            <xp:executeScript>
                                <xp:this.script><![CDATA[#{javascript:var teamList = getComponent("lstAvailableTeams");
    var strTeamKey = teamList.getValue();
    eu.jeroensomhorst.cms.util.LeagueUtil.addTeam(league.getKey(),strTeamKey);}]]></xp:this.script>
                            </xp:executeScript>
                        </xp:actionGroup>
                    </xp:this.action></xp:eventHandler></xp:button>

    <xp:listBox id="leagueTeams">
            <xp:selectItems>
                <xp:this.value><![CDATA[#{javascript:return eu.jeroensomhorst.cms.util.JSFUtil.asSelectItem(league.getTeams());}]]></xp:this.value>
            </xp:selectItems>
    </xp:listBox>

Leagueutil のコードは次のようになります。

public static void addTeam(String leagueKey,String key){
    LeagueService lService = (LeagueService) DominoUtil.getVariableValue("leagueService");

    League l = (League) lService.get(leagueKey);
    TeamService service = (TeamService) DominoUtil.getVariableValue("teamService");
    Team t = service.get(key);
    Vector<Team> teams = l.getTeams();
    if(teams == null){
        teams = new Vector();
        teams.add(t);
    }else{
        if(!teams.contains(t)){
            teams.add(t);
        }
    }

    l.setTeams(teams);
    // save into database.. this works.
    lService.set(l);

}

空想するものは何も見えないので。しかし、問題は次のとおりです。idLeagueList コンボボックスの値を変更して changelistener を実行するたびに ( viewscope を更新します)。これは、leagueteams コンボボックスに表示されている以前の値を常に取得します。それは本当に基本的な質問ですが、私は完全に選択肢がありません..

4

1 に答える 1

2

createObjectof のobjectData実行が早すぎます: ビューの復元フェーズが完了する前です。この方法objectDataで から古い値を取得しviewScope.currentKeyます。

createObject:           viewScope.currentKey = old value
afterRestoreView:       viewScope.currentKey = old value
beforeRenderResponse:   viewScope.currentKey = new value

この問題を解決する方法として、リーグ オブジェクトのビュー スコープ変数を代わりに使用することが考えられます。beforePageLoadイベントで設定できbeforeRenderResponseます。

viewScope.league = leagueService.get(viewScope.currentKey)

そしてそれをリストボックスで使用します

... eu.jeroensomhorst.cms.util.JSFUtil.asSelectItem(viewScope.league.getTeams())

とボタンコード

... eu.jeroensomhorst.cms.util.LeagueUtil.addTeam(viewScope.league.getKey(),strTeamKey)

テスト用の短いバージョンのコードを次に示します。viewScope.currentKeyprint ステートメントを使用して、いくつかの JSF フェーズでの現在の値を示しています。

<?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">
    <xp:this.afterRestoreView><![CDATA[#{javascript:print ("afterRestoreView: " + viewScope.currentKey)}]]></xp:this.afterRestoreView>
    <xp:this.beforeRenderResponse><![CDATA[#{javascript:print ("beforeRenderResponse: " + viewScope.currentKey)}]]></xp:this.beforeRenderResponse>
    <xp:this.afterRenderResponse><![CDATA[#{javascript:print ("afterRenderResponse: " + viewScope.currentKey)}]]></xp:this.afterRenderResponse>
    <xp:this.data>
        <xe:objectData
            var="league"
            ignoreRequestParams="true"
            scope="request">
            <xe:this.createObject><![CDATA[#{javascript:
                if (viewScope.currentKey == null) viewScope.currentKey = "aaa"; 
                print("createObject: " + viewScope.currentKey); 
                viewScope.currentKey}]]>
            </xe:this.createObject>
        </xe:objectData>
    </xp:this.data>
    <xp:comboBox
        id="idLeagueList"
        value="#{viewScope.currentKey}">
        <xp:selectItems>
            <xp:this.value><![CDATA[#{javascript: return ["aaa","bbb"];}]]></xp:this.value>
        </xp:selectItems>
        <xp:eventHandler
            event="onchange"
            submit="true"
            refreshMode="complete">
        </xp:eventHandler>
    </xp:comboBox>
    <xp:listBox
        id="leagueTeams">
        <xp:selectItems>
            <xp:this.value><![CDATA[#{javascript:
                print("listBox: league = " + league + " viewScope.currentKey=" + viewScope.currentKey); 
                if (league === "aaa") return ["aaa1","aaa2"]; else return ["bbb1","bbb2"]}]]>
            </xp:this.value>
        </xp:selectItems>
    </xp:listBox>
</xp:view>
于 2013-09-07T12:34:08.153 に答える