0

我目前正在研究一个包含XspInputText字段 a的 xsp 库组件XspCommandButton,以及一些使用ResponseWriter.

我能够渲染 korrekt 的所有东西,但现在我陷入了如何将 EventHandler 添加到我的 Button 的问题上。

据我所知,我有两个可能性将 a 添加XspEventHandler到页面或尝试使用addActionListener.XspCommandButton

我已经尝试了这两种方法,但没有任何运气的事件监听器我被onClick事件卡住了,XspEventHandler我找不到任何东西如何触发我的组件的方法之一。我已经搜索了互联网,但我没有找到关于这个主题的任何内容。

我在 /xsp/ComponentName.. 中查看了我的一个 XPage 代码,设计师使用 .setScript 方法通过以下方式添加脚本

MethodBinding script = evaluator.createMethodBinding(result,

但我认为这在我的例子中不起作用。

这是我的代码示例:

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

更新: 我在 Sven Hasselbach 的评论之后更新了我的代码,现在我可以完全刷新页面,但是我尝试通过的代码MethodeBinding没有被执行。我没有收到任何错误或消息,只是“什么都没发生”。

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);


    }

我对 ActionListeneris 的了解也有点有限,但我很确定我无法将这些ActionListener与 AWT 中使用的进行比较。

更新2:

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

我的组件:<div id="myComponentHolder1">

其他 XPage 组件:<span id="view:_id1:myComponent1">

解决了:

终于工作了。非常感谢 Sven 提供方法绑定的提示。它现在可以工作,但我不得不将createUpperDiv方法从 my移动Renderer到 my Component. 我还必须将 Component: 更改implementFacesComponent然后我将 Method 添加到buildContents方法中。

4

1 回答 1

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>

单击Add Event按钮会创建一个新事件并将其附加到Exec Event按钮。

也许这可以帮助你。

于 2013-06-26T06:39:06.463 回答