【问题标题】:identify the component from which the ajax listener is triggered识别触发 ajax 侦听器的组件
【发布时间】:2016-09-22 08:21:28
【问题描述】:

我有 2 个 inputText 组件:

<h:inputText id="inputCode">
    <f:ajax event="valueChange" listener="#{mbean.inputListener}"/>
</h:inputText>

<h:inputText id="inptValue"> 
    <f:ajax event="valueChange" listener="#{mbean.inputListener}"/>
</h:inputText>

在托管 bean 中:

字段:

long inputCode;
String inputText;

听者:

public void inputListener(AjaxBehaviorEvent abe) {
  UIInput uiinput = (UIInput)abe.getSource();
  if(the listener is triggered by the inputText with id="inputCode") {
     inputCode = (long)uiinput.getValue();
  } else {
     inputText = String.valueOf(uiinput.getValue());     
  }
}

问题是:我如何区分什么 inputText 是侦听器触发以知道在哪个字段中保存值? 我不想为每个 inputText 创建一个监听器。

我可以通过组件 id 使用 component.id 来做到这一点,但是当它有 2 个参数时如何使用该参数调用侦听器:AjaxBehaviorEvent 和另一个将是组件 id?

【问题讨论】:

  • 从组件中获取 id,就像你已经在伪代码中所做的那样
  • 嗯,好点,但我怎样才能将组件 id 作为参数传递给监听器呢?通过使用 listener=#{mbean.inputListener(component.id)} 将不起作用,因为 inputListener 有一个参数 AjaxBehaviorEvent。如果我有签名 inputCodeListener(AjaxBehaviorEvent abe, String componentId),我该如何调用这个方法?
  • 你没有,它已经在 uiinput 上(也许你需要向上转换它)
  • 不是一个真正的答案...我只是将输入值与托管 bean 中存储的当前(以前)值进行比较
  • 谢谢你们。 Kukeltje 我采纳了你的建议。我不认为你的建议是接受它的答案。 (我怎么能接受?)

标签: ajax jsf


【解决方案1】:

该 ID 已存在于 uiinput 上。您可以通过查看UIInput 的 api 看到这一点,所以您需要做的就是决定是否需要使用 id 或 clientId。后者以父命名容器的所有 id 为前缀。

public void inputListener(AjaxBehaviorEvent abe) {
  UIInput uiinput = (UIInput)abe.getSource();
  if(uiinput.getId().equals("inputCode")) {
     inputCode = (long)uiinput.getValue();
  } else {
     inputText = String.valueOf(uiinput.getValue());     
  }
}

应该做的伎俩。

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2013-05-19
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    相关资源
    最近更新 更多