【问题标题】:call partialRefreshGet from SSJS using view.PostScript使用 view.PostScript 从 SSJS 调用 partialRefreshGet
【发布时间】:2015-09-28 22:35:31
【问题描述】:

我在 BeforePageKoad 事件中运行了一个 SSJS。作为 SSJS 的最后一步,我想做部分刷新。在我的脚本中,我有这行代码:

view.postScript("partialRefreshGet('#{id:panelAll}')")

当它执行时,我收到一个错误,指出 partialRefreshGet 未定义。我猜我在通话格式中遗漏了一些东西,但据我了解,这应该可以。 以前有人做过这样的事情。 如果我忽略此代码,则从按钮手动刷新 panelAll 一切正常。

【问题讨论】:

  • 我很好奇为什么您会在初始页面加载时进行部分刷新。据推测,在部分刷新期间,一切都会重新计算为与初始加载时相同的值,因为用户还没有机会与页面交互。您能否提供有关您的用例的更多信息?
  • 我的代码得到一个“配置文件”文档,然后用控件中的值填充一堆控件。我将值加载到 NotesDocument 中,也许应该使用数据源,但除了刷新之外它工作正常。我在 XPage 上有一个按钮,它只是进行部分刷新,然后一切都很好。该代码仅在它是一个新文档时才会执行。

标签: xpages client-side xpages-ssjs


【解决方案1】:

你不能在 beforePageLoad 中使用 before view.postScript。尝试将其移至 afterPageLoad 或 beforeRenderResponse。我最近遇到了同样的问题。

http://notesspeak.blogspot.com/2013/08/viewpostscript-only-works-for-certain.html

这里是一个可以使用 view.postScript() 的总结:

  1. onClientLoad = 没有任何反应
  2. beforePageLoad = XSP 错误
  3. afterPageLoad = 工作!
  4. afterRestoreView = 没有任何反应
  5. beforeRenderResponse = 工作!
  6. afterRenderResponse = 没有任何反应

要了解为什么会这样,请阅读博文底部 Tim Tripcony 的评论。

【讨论】:

  • 我将它添加到了 beforeRenderResponse 中,我得到了同样的错误,所以我猜测语法有问题或者???
  • view.postScript 部分似乎正在工作,但它无法识别 partialRefreshGet 并说它未定义。
  • 比尔,view.postScript 的内容是客户端代码。看起来您的代码没有那里需要的分号。此外,ID 由服务器更改,它们看起来像“view:_id1:...” 检查 Firebug,然后将代码复制到控制台,看看你得到了什么。
  • 在查找了我没有使用过的 partialRefreshGet 方法之后,看起来您可以根据 xpageswiki.com 在 SSJS 中使用您可以使用的 id。您确实需要以“XSP”作为开头,这可能是“未定义”的原因
  • 很可能它试图过早地运行代码并且应该被包裹在XSP.addOnLoad()中;请参阅 Sven 的正确语法答案。
【解决方案2】:

只需将脚本块添加到您的 XPage 并进行所需的部分刷新。

编辑:

<xp:scriptBlock id="scriptBlock2" rendered="#{javascript:requestScope.doRefresh}">
    <xp:this.value><![CDATA[
       XSP.addOnLoad( function(){ XSP.partialRefreshGet('#{id:panelAll}') } );
   ]]>
   </xp:this.value>
</xp:scriptBlock>

如果需要,您可以在 beforePageLoad 中设置 requestScope 变量。

【讨论】:

  • 我添加了这个,刷新似乎没有发生。我将 XSP.addOnLoad 更改为仅执行 viewScope.put 并且正在执行代码。所以这个 addOnLoad 应该发生在 beforePageLoad 之后,所以它应该有 beforePageLoad 中设置的所有值。在 beforePageLoad 中,我修改了 NotesDocument 而不是数据源,但我认为这无关紧要。正确加载页面后,按钮上的 partialRefresh 会刷新所有控件。我猜这是一个时间问题,但我有点迷失了。感谢您的帮助!
  • @BillF:在我看来,客户端和服务器端代码之间存在误解。另一个问题是更改文档而不是数据源很重要,这就是您的代码无法正常工作的原因。
【解决方案3】:

这个答案可能有点晚了,我希望它对某人有用。

所以,简单的答案是使用以下 SSJS 刷新另一个组件: view.postScript("XSP.partialRefreshGet('#{id:Component ID}')")

但是,我在尝试它时遇到了麻烦,正如 Tim Tripcony 所建议的那样,代码似乎运行得太快了,而浏览器仍在接受第一次刷新,但它不起作用。所以我尝试将它附加到一个 OnLoad 事件中,如下所示:

view.postScript("XSP.addOnLoad(function() {XSP.partialRefreshGet('#{id:Component ID}')})")

但这也没有用。所以我用旧方法做了,它通过使用 setTimeout() 让脚本在不同的线程中工作,如下所示:

view.postScript("setTimeout(function(){XSP.partialRefreshGet('#{id:Component ID}')}, 1)");

它就像一个魅力!

【讨论】:

  • 实际上,我个人使用的是 partialRefreshPost() 函数,而不是 Get,但为了提问者的逻辑,我已将其作为 Get 包含在此答案中;而且我认为这种差异不会影响答案的有效性。
猜你喜欢
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多