如何在Primefaces中覆盖ContentFlow配置

时间:2014-09-08 05:35:47

标签: javascript jsf-2 primefaces contentflow

我想覆盖onclickActiveItem函数,需要检索当前活动项索引或在Primefaces中使用onMakeActive调用某些内容,最佳方法是什么?

我能够通过以下方式调用函数:

<p:contentFlow value="#{imagesView.images}" var="image" widgetVar="img">
            <p:graphicImage value="/images/imgs/img#{image}.jpg" styleClass="content" onclick="select(#{image})" />
        </p:contentFlow>

然后在javascript中:

function setImageIndex(i){
        return;
    }
function select(i) {
        ContentFlowGlobal.Flows[0].setConfig({onclickActiveItem:setImageIndex});
    }

但如果我这样尝试: ContentFlowGlobal.Flows[0].setConfig({onclickActiveItem:setImageIndex(i)}); 它可以工作,但许多控制台错误记录,如“onclickActiveItem不是一个函数”!

因此,通过这种方式,我删除了打开图像本身的默认操作,我可以使用onclick进行调用,我希望更好地覆盖ContentFlow js,我仍然认为我做错了。

知道在primefaces中覆盖ContentFlow javascript配置的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

ContentFlow是一个纯粹的jQuery插件,PrimeFaces就是这样处理的,没有额外的味道添加到widget, 所以你可以使用普通的jQuery来实现这一点,不需要复杂化甚至深入了解插件的事件。

例如,您可以使用onclick,如果该项目正常点击,则活动

$(document).on('click', '.flow .item', function(){
   var imageIndex = $(this).index();// the image index
   $(this).find('canvas').attr('src');// the image src
   // then you could call a remoteCommand from here passing the index
})

修改:为了防止图像被打开(如果图像已被选中),您可以采用这种方法......

<p:contentFlow value="#{mainBean.batImages}" var="image">
   <p:graphicImage name="images/list/#{image}" styleClass="content" onclick="clickFlow(this, event)" />                        
 </p:contentFlow> 

现在javascript非常简单:

function clickFlow(item ,e) {  
   //prevents image opening...                                                                     
   if ($(item).parent().hasClass('active')) {
      e.stopImmediatePropagation();                                                              
   }
}

基本上,您检查用户是否已单击活动图像,如果是,则调用stopImmediatePropagation(),以防止其余处理程序被执行,并防止事件冒泡DOM树。

这是 working demo

答案 1 :(得分:0)

通过使用AddOn,我发现从我之前使用的第一种方式中获得了更好,更清晰的方式并保证了方式和更清晰:

if (typeof ContentFlowGlobal != 'undefined') {
    new ContentFlowAddOn('ImageSelectAddOn', {
        ContentFlowConf : {
            // onclickInactiveItem: function (item) {
            // this.conf.onclickActiveItem(item);
            // },
            onclickActiveItem : function(item) {
                var content = item.content;
                var i = item.index;
                // console.log("index : "+item.index);
                imageId = i + 1;
                // console.log("select called image id : " + imageId);
                ma([ {
                    name : 'id',
                    value : imageId
                } ]);
            },
            onReachTarget : function(item) {
                this.conf.onclickActiveItem(item);
            }
        }
    });
    ContentFlowGlobal.setAddOnConf("ImageSelectAddOn");
}

可以在以下链接中找到ContentFlow的完整文档:http://www.jacksasylum.eu/ContentFlow/docu.php,您可以进行大量自定义。

P.S。:ma()name的{​​{1}}所以我可以将变量传递给backbean。

我的问题就这样解决了,我对这种方式表示满意,希望以后能分享一些对别人有用的东西。