XPages:image onCclick需要2次点击才能完成预期的操作

时间:2014-12-24 14:48:33

标签: xpages xpages-ssjs

我有一个包含2张图片的自定义控件:添加和删除收藏夹。

图像的onCLick事件上有一些代码,两个图像都使用SSJS函数来查看当前文档是否已经在收藏夹中,在每个图像的可见属性中。

一切正常,我需要在图像上单击两次才能看到UI中的更改。两个onClick事件都设置为FullUpdate(也尝试使用包含图像的面板进行部分更新)。

我可以将所有收藏夹逻辑移动到会话范围变量中,但我认为这应该按原样运行。我只是不明白为什么我需要点击两次,好像部分刷新没有做任何事情(虽然它是,因为我在浏览器中看到重新加载箭头!)。

可能是代码执行时间过长而且刷新没有获得更新的信息???

这是自定义控制代码:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xe="http://www.ibm.com/xsp/coreex">

    <xp:this.resources>
        <xp:script src="/AppUtils.jss" clientSide="false"></xp:script>
    </xp:this.resources>
    <xp:image url="/favorites-add.png" id="image1"
        alt="Add to Favorites" title="Add to Favorites">
        <xp:this.rendered><![CDATA[#{javascript:!isInFavorites(document1.getDocument().getUniversalID(), userBean.canonicalName);
}]]></xp:this.rendered>
        <xp:eventHandler event="onclick" submit="true" refreshMode="complete">
            <xp:this.action><![CDATA[#{javascript:addToFavorites(document1.getDocument().getUniversalID(),userBean.canonicalName);}]]></xp:this.action>
        </xp:eventHandler>
    </xp:image>
    <xp:image url="/favorites-remove.png" id="image2"
        alt="Remove from Favorites" title="Remove from Favorites">
        <xp:this.rendered><![CDATA[#{javascript:isInFavorites(document1.getDocument().getUniversalID(),userBean.canonicalName);
}]]></xp:this.rendered>
        <xp:eventHandler event="onclick" submit="true"
            refreshMode="complete">
            <xp:this.action><![CDATA[#{javascript:removeFromFavorites(document1.getDocument().getUniversalID(),userBean.canonicalName);}]]></xp:this.action>
        </xp:eventHandler>
    </xp:image>
</xp:view>

这是SSJS:

function addToFavorites(unid, userName) {
    var newDoc:NotesDocument = database.createDocument();
    newDoc.appendItemValue("Form","Favorite");
    newDoc.appendItemValue("UserName", userName);
    newDoc.appendItemValue("DocUNID", unid);
    newDoc.save();
    return;
}

function removeFromFavorites(unid, userName) {
    var notesView:NotesView = database.getView("(lkpFavorites)");
    var keys = new java.util.Vector();
    keys.addElement(userName);
    keys.addElement(unid);
    var coll:NotesDocumentCollection = notesView.getAllDocumentsByKey(keys, true);
    if(coll.getCount()==1) {
        coll.getFirstDocument().remove(true);
    }
    return;
}

function isInFavorites(unid, userName) {
    var notesView:NotesView = database.getView("(lkpFavorites)");
    var keys = new java.util.Vector();
    keys.addElement(userName);
    keys.addElement(unid);
    var coll:NotesDocumentCollection = notesView.getAllDocumentsByKey(keys, true);
    if(coll.getCount()>0) {
        return true;
    } else {
        return false;
    }
}

2 个答案:

答案 0 :(得分:1)

我建议您在图片周围放置一个xp:链接来投射事件代码,而不是直接使用图像的偶数。

答案 1 :(得分:0)

好的,不确定那里发生了什么,但我手动编辑了自定义控件的源代码,看看我是否有Oliver建议的空的eventHandler,它开始按预期工作。我完全不确定我改变了什么:据我所知,我所做的只是在源视图中添加额外的“返回”,使其更具可读性......我想是圣诞礼物。

现在一切都很好。感谢所有人:)