选择服务器操作的Skyve非持久主页进入无限循环



使用Skyve 7.0.2。

我有一个非持久性主页文档,它的视图中包含一个树。当树被填充时,我会得到一个无限循环的客户端-服务器请求。

edit.xml(在使用HomeRef=edit时使用(显示了我的文件系统文件夹树。我想做的是从树中选择一行,在同一页上显示该文件夹中的文件。我有一个LoadFiles操作,从onSelectedHandlers调用。事实上,这加载并显示了文件,但随后树开始不断刷新,我在流量中看到了对树内容(qFolders查询(和LoadFiles操作的不断请求。所以是一个连续的循环。我尝试了几件事,但都找不到是什么导致了循环以及如何防止循环。如果有人能给出一个提示,那将是最有帮助的。

src/main/java/modules/mymod/Homepage/Homepage.xml

<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://www.skyve.org/xml/document" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Homepage" xsi:schemaLocation="http://www.skyve.org/xml/document ../../../schemas/document.xsd">
<singularAlias>Home</singularAlias>
<pluralAlias>Homepages</pluralAlias>
<iconStyleClass>fa fa-file-text</iconStyleClass>
<parentDocument/>
<bizKey expression="Home - {name}"/>
<attributes>
<text name="name">
<displayName>Name</displayName>
<length>250</length>
</text>
<id name="selectedFolderId">
<displayName>SelectedFolder ID</displayName>
</id>
<association type="aggregation" name="selectedFolder">
<displayName>Selected folder</displayName>
<documentName>Folder</documentName>
</association>
<collection type="aggregation" name="files">
<displayName>Files</displayName>
<documentName>File</documentName>
<minCardinality>0</minCardinality>
<ordering/>
</collection>
</attributes>
<conditions>
<condition name="hasSelectedFolder">
<description>If folder is set</description>
<expression>
<![CDATA[selectedFolder != null]]>
</expression>
</condition>
</conditions>
</document>

src/main/java/modules/mymod/Homepage/views/edit.xml

<?xml version="1.0" encoding="UTF-8"?>
<view xmlns="http://www.skyve.org/xml/view" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="edit" title="Home" xsi:schemaLocation="http://www.skyve.org/xml/view ../../../../schemas/view.xsd">
<hbox>
<treeGrid title="Folder hierarchy" percentageWidth="30" responsiveWidth="4"
query="qFolders"
continueConversation="true"
selectedIdBinding="selectedFolderId" autoPopulate="true">
<onSelectedHandlers>
<server action="LoadFiles"/>
</onSelectedHandlers>
</treeGrid>
<vbox borderTitle="Files in current folder">
<dataGrid title="Files" binding="selectedFolder.files">
<boundColumn binding="name"/>
<boundColumn binding="publisher"/>
<onEditedHandlers/>
<onSelectedHandlers/>
</dataGrid>
</vbox>
</hbox>
<actions>
<defaults/>
<action className="LoadFiles" clientValidation="false" displayName="LoadFiles" inActionPanel="false"></action>
</actions>
</view>

src/main/java/modules/mymod/Homepage/actions/LoadFiles.java

package modules.mymod.Homepage.actions;
import org.skyve.CORE;
import org.skyve.metadata.controller.ServerSideAction;
import org.skyve.metadata.controller.ServerSideActionResult;
import org.skyve.web.WebContext;
import modules.mymod.domain.Folder;
import modules.mymod.domain.Homepage;
public class LoadFiles implements ServerSideAction<Homepage> {
/**
* For serialization.
*/
private static final long serialVersionUID = 2165829726729411782L;
@Override
public ServerSideActionResult<Homepage> execute(Homepage bean, WebContext webContext) throws Exception {
if (bean.getSelectedFolderId() != null) {
if (bean.getSelectedFolder() == null || bean.getSelectedFolder().getBizId() != bean.getSelectedFolderId()) {
Folder folder =
CORE.getPersistence().retrieve(Folder.MODULE_NAME, Folder.DOCUMENT_NAME, bean.getSelectedFolderId());
bean.setSelectedFolder(folder);
}
bean.setSelectedFolderId(null);
}
return new ServerSideActionResult<Homepage>(bean);
}
}

为了完整性,还有mymod.xml、Folder.xml和File.xml

src/main/java/modules/mymod/mymod.xml

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="http://www.skyve.org/xml/module" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" title="mymod" prototype="true" name="mymod" xsi:schemaLocation="http://www.skyve.org/xml/module .
./../schemas/module.xsd">
<homeRef>edit</homeRef>
<homeDocument>Homepage</homeDocument>
<documents>
<document ref="Folder"/>
<document ref="File"/>
<document ref="Homepage"/>
</documents>
<roles>
<role name="Viewer">
<description><![CDATA[Enough privileges to view documents.]]></description>
<privileges>
<document name="Folder" permission="_R__C"/>
<document name="File" permission="_R__C"/>
<document name="Homepage" permission="_R__C"/>
</privileges>
</role>
<role name="Maintainer">
<description><![CDATA[Enough privileges to create and edit documents.]]></description>
<privileges>
<document name="Folder" permission="CRUDC"/>
<document name="File" permission="CRUDC"/>
<document name="Homepage" permission="CRUDC"/>
</privileges>
</role>
</roles>
<menu>
<edit document="Homepage" name="Home">
<role name="Maintainer"/>
<role name="Viewer"/>
</edit>
<tree autoPopulate="true" document="Folder" name="Folders">
<role name="Maintainer"/>
<role name="Viewer"/>
</tree>
<list autoPopulate="true" document="File" name="Files">
<role name="Maintainer"/>
<role name="Viewer"/>
</list>
</menu>
<queries>
<query name="qFolders" documentName="Folder">
<description>Folder Structure</description>
<columns>
<column binding="name" sortOrder="ascending"/>
</columns>
</query>
</queries>
</module>

src/main/java/modules/mymod/Folder/Folder.xml

<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://www.skyve.org/xml/document" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Folder" xsi:schemaLocation="http://www.skyve.org/xml/document ../../../schemas/document.xsd">
<abstract>false</abstract>
<persistent name="DOC_Folder"/>
<singularAlias>Folder</singularAlias>
<pluralAlias>Folders</pluralAlias>
<audited>true</audited>
<iconStyleClass>fa fa-folder</iconStyleClass>
<parentDocument databaseIndex="true">Folder</parentDocument>
<bizKey expression="Folder - {name}"/>
<attributes>
<text required="true" trackChanges="true" name="name">
<displayName>Name</displayName>
<length>50</length>
</text>
<collection type="child" name="files">
<displayName>Files</displayName>
<documentName>File</documentName>
<minCardinality>0</minCardinality>
<ordering/>
</collection>
</attributes>
</document>

src/main/java/modules/mymod/File/File.xml

<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://www.skyve.org/xml/document" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="File" xsi:schemaLocation="http://www.skyve.org/xml/document ../../../schemas/document.xsd">
<persistent name="DOC_File"/>
<singularAlias>File</singularAlias>
<pluralAlias>Files</pluralAlias>
<iconStyleClass>fa fa-file-text</iconStyleClass>
<parentDocument>Folder</parentDocument>
<bizKey expression="File - {name}"/>
<attributes>
<text name="name">
<displayName>Name</displayName>
<length>250</length>
</text>
<text name="publisher">
<displayName>Publisher</displayName>
<length>250</length>
</text>
</attributes>
</document>

因此,我认为发生的情况是,当您在树中选择一个项目时,onSelectedHandler正在调用您的LoadFiles操作,这导致当服务器处理您的操作并将响应发送回客户端时,树会重新呈现。

Skyve提供了一个postRefresh属性来控制树是否应该在发布后重新渲染,因此您可以尝试在树网格上设置postRefresh="false"

您也可以尝试在treeGrid上设置continueConversation="false",因为导航无法通过树进行,需要继续用户对话。

最新更新