XspCommandButton事件处理AktionListener或XspEventHandler

时间:2013-06-26 06:14:01

标签: xpages xpages-extlib

我目前正在处理一个xsp库组件,其中包含一个XspInputText字段XspCommandButton,以及一些使用ResponseWriter创建的自定义html代码。

我能够渲染每一件事korrekt,但现在我遇到了如何将一个EventHandler添加到我的Button的问题。

到目前为止,我可以看到我有两个可能性为页面添加XspEventHandler或尝试使用addActionListener的{​​{1}}。

我已经尝试了两个没有任何运气的事件监听器我遇到了XspCommandButton事件并且onClick我找不到任何如何触发我的组件的方法之一。我在互联网上搜索过但我在这个主题上一无所获。

我查看了/ xsp / ComponentName中的一个XPage代码..设计者使用.setScript方法通过

添加脚本
XspEventHandler

但我认为这不适用于我的例子。

以下是我的代码示例:

MethodBinding script = evaluator.createMethodBinding(result,

更新 我在Sven Hasselbach的评论之后更新了我的代码,现在我能够对页面进行全面刷新,但是我尝试通过public class myComponentRenderer extends Renderer{ public void encodeBegin(FacesContext context, UIComponent component) throws IOException { XspDiv div = createSearchDiv(context,control.getTypeAheadList()); div.encodeBegin(context); div.encodeChildren(context); div.encodeEnd(context); } private XspDiv createUpperDiv(FacesContext context,ArrayList<String> typeAheadList) throws IOException{ XspDiv container = new XspDiv(); container.setId("container"); XspInputText SearchInput = new XspInputText(); SearchInput.setId("input"); SearchInput.setRole("textbox"); SearchInput.setStyleClass("lotusText"); SearchInput.setType("text"); XspTypeAhead searchTypeAhead = new XspTypeAhead(); searchTypeAhead.setIgnoreCase(true); searchTypeAhead.setMode("partial"); searchTypeAhead.setVar("typed"); searchTypeAhead.setValueMarkup(true); searchTypeAhead.setMinChars(1); searchTypeAhead.setValueList(typeAheadList); XspCommandButton searchButton = new XspCommandButton(); searchButton.setId("searchBtn"); searchButton.addActionListener(/* ? new AktionListener(...)*/); //or 的代码没有被执行。我没有收到任何错误或消息,只是“没有什么事情发生”。

MethodeBinding

我对ActionListeneris的了解也有点受限,但我很确定我无法将这些XspEventHandler searchEvent = new XspEventHandler(); MethodBinding action = context.getApplication().createMethodBinding("#{javascript:print(\"Hallo World\");}", null); searchEvent.setAction(action); searchEvent.setSubmit(true); searchEvent.setEvent("onclick"); searchEvent.setRefreshMode("complete"); searchButton.getChildren().add(searchEvent); container.getChildren().add(searchTypeAhead); container.getChildren().add(SearchInput); container.getChildren().add(searchButton); } 与AWT中使用的{。}}进行比较。

UPDATE2:

我发现了另一个有趣的事情,maby解释了为什么我的脚本没有被执行。当我看一下我的组件的客户端HTML代码时,我可以看到他们没有像我的其他XPage那样得到任何计算ID。

我的组件:ActionListener

其他XPage组件:<div id="myComponentHolder1">

解决:

终于工作了。非常感谢Sven提供的方法绑定提示。它现在有效,但我必须将<span id="view:_id1:myComponent1">方法从我的createUpperDiv移到我的Renderer。此外,我必须更改组件:Component implement然后我将方法添加到FacesComponent方法。

1 个答案:

答案 0 :(得分:2)

您可以从应用程序实例创建方法绑定并将其附加到按钮。 这是一个示例XPage

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">

    <xp:button
        value="Add Event"
        id="button1">
    <xp:eventHandler
        event="onclick"
        submit="true"
        refreshMode="complete">
        <xp:this.action>
            <![CDATA[#{javascript:
                var event = new com.ibm.xsp.component.xp.XspEventHandler();
                var code = "#{javascript:print(\"Hello World!\")}"
                var action = facesContext.getApplication().createMethodBinding( code, null );

                event.setAction(action);
                event.setSubmit(true);
                event.setEvent("onclick");
                event.setRefreshMode("complete");

                var cmp = getComponent("button2");
                cmp.getChildren().add( event );

            }]]>
            </xp:this.action>
    </xp:eventHandler></xp:button>
    &#160;
    <xp:button
        value="Exec Event"
        id="button2">
    </xp:button>
</xp:view>

单击添加事件按钮可创建新事件并将其附加到 Exec事件按钮。

也许这可以帮到你。