我目前正在处理一个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
方法。
答案 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>
 
<xp:button
value="Exec Event"
id="button2">
</xp:button>
</xp:view>
单击添加事件按钮可创建新事件并将其附加到 Exec事件按钮。
也许这可以帮到你。