1

似乎 Primefacesp:selectOneMenu组件将呈现的 HTML<select>标记包装在 div 中,并将所选项目显示为不同的标签。我猜,用户所做的更改会<select>通过 javascript 反映到原始版本,导致绑定到的 onchange 事件<select>无法正常工作。因此,我对所有 s 的 onchange 事件的以下绑定:input不适用于p:selectOneMenus。

function applyChangeHandler() {
    $(':input').on('change', function() {
        console.log('on change: ' + this.id);
    });
}

然而 onchange 的属性p:selectOneMenu正在被触发。所以 Primefaces 在后台触发了这个处理程序(我猜也是)。

<p:selectOneMenu id="myList" onchange="console.log('selectOneMenu')">
    <f:selectItem itemLabel="val1" itemValue="val1"/>
    <f:selectItem itemLabel="val2" itemValue="val2"/>
</p:selectOneMenu>

所以我的要求是以某种方式将 onchange 处理程序绑定到p:selectOneMenu上面的 applyChangeHandler() 函数中的所有 s。或者它可以通过 Primefaces 特定的 API 或我希望你们分享的其他方式手动触发。否则,将使用一个快速的解决方法h:selectOneMenu

我的目标是检测“页面上未保存的更改”。所以上面的脚本将被放置在一个通用模板中,如下所示:

<p:outputPanel id="sc" autoUpdate="true">
    <script type="text/javascript">
        applyChangeHandler();
    </script>
</p:outputPanel>
4

3 回答 3

1

为什么框架已经为您提供了额外的侦听器?

如果您的目标是使用 jQuery,您只需将处理程序放在可从窗口全局范围访问的 js 文件中。

function myChangeHandler(that) {
    //wrap the element with jQuery
    var select = jQuery(that);
    //Get the div parent. The actual wrapper of the `selection-menu` widget markup
    var selectMenu = select.parents('div.ui-selectonemenu');
    //From here I can manipulate any HTML child element using jQuery
    jQuery('label.ui-selectonemenu-label', selectMenu).text('mooo');
}

然后调用你的处理程序onchange,传递selectOneMenuas 参数

<p:selectOneMenu id="myList" onchange="myChangeHandler(this)">
    <f:selectItem itemLabel="val1" itemValue="val1" />
    <f:selectItem itemLabel="val2" itemValue="val2" />
</p:selectOneMenu>
于 2013-01-22T14:13:12.400 回答
0

您可以使用“DOMSubtreeModified”,而不是使用 onChange。

这适用于 p:selectOneMenu

$(".ui-selectonemenu-label").each(function(index) {
    $(this).on("DOMSubtreeModified", setDirty());
});

还。如果您希望到处都使用相同的通用代码,另一种可能性是覆盖 SelectOneMenu 的原型,如下所示:

var origTriggerChange = PrimeFaces.widget.SelectOneMenu.prototype.triggerChange;
// if this code has been run already, don't accumulate triggerChangemethods!
if(origTriggerChange.isModified != "true"){
      PrimeFaces.widget.SelectOneMenu.prototype.triggerChange = function(b){
      this.jq.find("select").change();
      origTriggerChange.call(this, b);
   };
   PrimeFaces.widget.SelectOneMenu.prototype.triggerChange.isModified = "true";
}
于 2013-09-03T09:46:02.243 回答
0

您需要将widgetVar添加到p:selectOneMenu以在JS中使用它

<p:selectOneMenu id="myList" onchange="console.log('selectOneMenu')" widgetVar="myList">
  <f:selectItem itemLabel="val1" itemValue="val1"/>
  <f:selectItem itemLabel="val2" itemValue="val2"/>
</p:selectOneMenu>

这会将此代码添加到您的页面

$(function(){
  PrimeFaces.cw("SelectOneMenu","myList",{
       id:"A2:Form:myList",
       effect:"fade"
  })
});

希望这会有所帮助。

于 2013-09-15T13:03:07.393 回答