0

我想覆盖onclickActiveItem函数并且需要检索当前的活动项目索引或onMakeActive在 Primefaces 中调用一些东西,最好的方法是什么?

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

<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配置的正确方法是什么吗?

4

2 回答 2

1

ContentFlow是一个纯粹的 jQuery 插件,PrimeFaces 就是这样处理的,没有给小部件添加额外的味道,所以你可以使用普通的 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 树中冒泡。

这是一个 工作演示

于 2014-09-08T08:37:05.577 回答
1

通过使用 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 ,然后你可以做很多定制。

PS:ma()是的namep:remoteCommad所以我可以将变量传递给backbean。

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

于 2014-09-16T06:03:32.877 回答