是否可以延迟加载xpage上的某些控件?
这就是问题所在:假设您有一个控件来执行fultextsearch并在重复控件中显示结果。这个ft搜索可能需要很长时间,并且会将网页加载到等待状态,直到搜索结果准备就绪。
我希望我的页面能够初始加载大部分数据,并且一些“耗时”的控件应该在初始加载后作为sperate请求加载到页面中。
用这种方式,用户将立即看到该网页,但页面上的一些数据会稍后加载,而不会让网页处于服务器的等待状态。可能?
答案 0 :(得分:6)
使用渲染的缺点是所有值绑定仍将进行评估,即使相应的标记未发送到页面也是如此。因此,这里的技巧是确保组件在您需要它们之前不存在。
每个组件都有一个getChildren()方法。这将返回一个可变的组件列表,它具有add()方法。这允许您在页面加载时或在事件期间稍后随时向页面添加组件。出于您想要做的目的,您可能希望推迟添加“昂贵”组件,直到后续事件。
创建一个直接附加到视图根()的事件处理程序,给它一个唯一的ID(例如“loadExpensiveComponentsEvent”,将其刷新模式设置为partial,将刷新ID设置为任何div或面板将包含搜索结果,以及将其事件名称设置为任意事件(例如“loadExpensiveComponents”)。这可以防止事件被实际用户行为触发。将事件的代码设置为SSJS,将注入组件。
然后添加一个脚本块()以在页面加载后触发事件:
XSP.addOnLoad(函数(){ XSP.firePartial(null,“#{id:loadExpensiveComponentsEvent}”); });
您的页面将在没有搜索结果组件的情况下加载。页面完全加载后,将自动触发组件注入事件。
有关如何对注入事件进行编码的指导,请打开从现有页面生成的Java文件,以查看需要注入哪些组件以及将值设置为什么。
答案 1 :(得分:2)
您可以将它们打包到面板中,并将其渲染状态设置为render =#{viewScope.pageFullyLoaded}。然后在onLoad事件中有一个XSP。 partialRefresh请求,您可以在其中设置viewScope.pageFullyLoaded = true 有点难看但可行。现在您可以将该代码包装到您自己的自定义控件中,这样您就可以拥有“lazyGrid”,“lazyPanel”等。
答案 2 :(得分:0)
不知道为什么我之前没想过这个。 extlib中的动态内容控件实际上解决了这个问题。在页面加载后,可以使用javascript和ssjs触发onClientLoad上的dcc。
我现在面临的一个问题是我已经在我的网站上使用了dcc所以我需要在我的dcc中添加另一个dcc。这似乎有点儿麻烦。我已经在openNTF上向extlib团队报告过了。