Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpages文档更改文档模式?_Xpages - Fatal编程技术网

Xpages文档更改文档模式?

Xpages文档更改文档模式?,xpages,Xpages,我有一件奇怪的事情发生;像往常一样,我不能发布代码,不幸的是,我正在描述这个问题,以防有人能提出可能的原因 我有一个包含自定义控件的xpage;自定义控件通过链接处理文档锁定和更改为编辑/只读模式。文档锁定是通过基于UNID设置applicationScope变量来完成的。为了让系统上的其他用户更友好,我定期在页面上运行一个函数,检查文档是否被锁定,并适当地更新链接/标签/工具提示(例如,如果被其他用户锁定,则“编辑”按钮被禁用;当解除锁定时,它被启用)。这是通过一个标准的、简单的基于dojo的

我有一件奇怪的事情发生;像往常一样,我不能发布代码,不幸的是,我正在描述这个问题,以防有人能提出可能的原因

我有一个包含自定义控件的xpage;自定义控件通过链接处理文档锁定和更改为编辑/只读模式。文档锁定是通过基于UNID设置applicationScope变量来完成的。为了让系统上的其他用户更友好,我定期在页面上运行一个函数,检查文档是否被锁定,并适当地更新链接/标签/工具提示(例如,如果被其他用户锁定,则“编辑”按钮被禁用;当解除锁定时,它被启用)。这是通过一个标准的、简单的基于dojo的ajax调用来调用“xagent”来实现的

由于某种原因,系统的行为在45秒到一分钟后变得不稳定。我每10秒左右检查一次锁状态,所以第一次呼叫时不会发生这种情况。我正在显示与文档关联的记录列表;每条记录都是重复中的一行。当我第一次进入编辑模式时,所有控件都按其应有的方式显示,即可编辑。如果用户使用组合框更改特定值,则会使用部分刷新更新整行。当事情变得不稳定时,我注意到行开始以只读模式刷新,这向我表明文档正在更改编辑模式。我唯一一次故意更改编辑模式是按下“取消”或“保存”按钮。(锁定机制本身与编辑模式无关。)


显然,我所做的ajax调用似乎是问题的根源。但是我已经将xagent和客户端代码剥离到几乎什么都没有,而且它仍然在发生。我看不出是什么导致了这种行为。有人能猜一猜吗?谢谢……

没有代码很难进行故障排除,但这里有一些想法:

  • 您如何检查文档锁定?通过客户端JavaScript AJAX调用或XPages部分刷新?如果是后者,刷新区域是什么?如果是前者,您要传递的刷新区域和返回的HTML是什么?当您在一行的编辑模式下进行检查时,是否总是发生这种情况,或者与此无关?这里要检查的关键是锁定检查的作用-是检查服务器并在repeat之外返回消息,还是检查服务器并返回HTML以默认值覆盖浏览器上当前的内容,例如,文档模式为读取模式
  • 浏览器和服务器之间正在发生什么网络活动以及何时发生?是覆盖该行的HTML的其他内容,因此将该行重置为读取模式
  • 这不太可能是随机的,关键是确定可复制的步骤,以确定常见的场景和原因

    编辑
    根据您的其他信息,编辑链接上是否有渲染属性?如果在早期JSF生命周期阶段计算为false,则在调用应用程序阶段无法触发eventHandler。由于eventHandler还包括refreshId,因此没有refreshId和refreshMode,因此默认为完全刷新,没有运行SSJS。请参阅此博客文章以获得澄清。

    也许可以检查服务器日志文件是否有如下警告:

    警告CLFAD#####W:状态数据不可用于/page,因为在缓存中找不到控件树

    如果您看到这些警告,可能是服务器在缓存中找不到当前的XPage页面实例。在这种情况下,页面将恢复到初始状态,就像第一次打开页面时一样。这可能就是文档进入只读模式的原因

    当xsp.persistence.mode=basic时,服务器端页面实例的会话缓存仅容纳4个页面,或者当xsp.persistence.mode=file或fileex时,它容纳16个实例

    如果加载4个xagent页面实例,则缓存将被填满,并且它将无法再为当前正在查看的XPage找到页面实例。因此XPage将停止执行服务器端操作,部分刷新将始终显示页面该区域的初始状态

    为了避免该问题,在xagent页面中,您可以在xp:view标记上设置viewState=“nostate”,这样就不会为xagent页面保存页面实例,如下所述:

    或者,您可以为xagent创建并重用一个页面实例,因此只创建一个页面实例。也就是说,在第一次调用XAgent时,让XAgent返回XAgent页面实例(#{javascript:view.getUniqueViewId()})的$$viewid值,然后在对XAgent的后续请求中,在请求中使用该$$viewid来恢复现有的XAgent页面实例,而不是创建将填充缓存的新实例。因此,后续的xagent请求如下所示:


    /myApp.nsf/xagent1.xsp?$$viewid=!啊,啊

    问得好,保罗。1.我通过客户端AJAX调用收集锁定信息,而不是部分刷新。它调用一个xagent,它只是返回json数据,而不是页面的实际刷新部分。锁定系统仅读取/修改应用范围;除了必要时获取UNID外,它对文档不做任何其他操作。(我想我从朱利安·巴斯那里得到了大部分代码和想法。)这就是为什么我不明白模式是如何变化的。2.我正在开发工具中查看网络传输,AJAX调用是唯一发生的事情(正如预期的那样);这是标准的“compositeData.theDoc.isEditable()”。我们在任何地方都使用它,尽管在定制控件中通常不使用。我承认我对JSF生命周期阶段一无所知,所以我不确定到底发生了什么。。。。我甚至更困惑的是,无论发生什么,它都能很好地为我们服务