我正在尝试构建一个允许用户编辑和非编辑视图的用户界面。目前它正在工作,但有一个我不明白的小错误。有人可以解释 JSF 渲染和 ajax 的确切工作流程导致以下情况:
当页面第一次加载或重新加载时,触发编辑模式的“编辑”按钮工作得很好。
一旦我通过左侧菜单中的 ajax 更新 id="currentChapters" 部分的内容,我必须单击两次“编辑”按钮才能渲染编辑器(无论我使用什么事件 - onclick、oncomplete 或 JSF 操作)。进入编辑视图并返回非编辑视图后,再次单击该按钮即可。
- 当我只用标签(而不是全部内容)围绕编辑器并使用 navLink 作为编辑按钮时,navLink 工作得非常好。但是当我在进入编辑模式后尝试保存编辑器内容时,保存按钮现在只在第二次点击时起作用。
我没有落后于导致这个问题的事件流。
<ui:composition template="../WEB-INF/templates/template-main.xhtml" >
<ui:define name="title">Projekt</ui:define>
<ui:define name="content">
<f:metadata>
<f:viewAction action="#{ProjectBacking.onPageLoad()}" />
</f:metadata>
<b:row class="projects-page">
<b:column span="3" styleClass="project-menu-left">
<b:accordion rendered="#{Login.user.team.project != null}">
<c:forEach items="#{ProjectBacking.projectDocuments}" var="document">
<b:panel title="#{document.documentName}">
<b:listLinks>
<c:forEach items="#{document.projectChapters}" var="chapter">
<b:navLink value="#{chapter.chapterOrder}.#{chapter.chapterName}" update="currentChapters">
<f:ajax listener="#{ProjectBacking.setCurrentContentForChapter(chapter)}"
render="currentChapters"/>
</b:navLink>
</c:forEach>
</b:listLinks>
</b:panel>
</c:forEach>
</b:accordion>
</b:column>
<b:column span="9" id="currentChapters" >
<h:form id="form-ckeditor">
<b:row rendered="#{Login.user.team.project != null}">
<b:column span="12">
<h:panelGroup layout="block" styleClass="user-content-header">
#{ProjectBacking.currentContent.projectChapter.projectDocument.documentName} - #{ProjectBacking.currentContent.projectChapter.chapterName}
</h:panelGroup>
</b:column>
<b:column span="12">
<h:panelGroup layout="block"
styleClass="project-content"
rendered="#{!ProjectBacking.isEdit}">
<h:outputText value="#{ProjectBacking.currentContent.content}"
escape="false"/>
</h:panelGroup>
</b:column>
<b:column span="3">
<b:commandButton value="Edit"
look="success"
rendered="#{!ProjectBacking.isEdit}"
action="#{ProjectBacking.setIsEditTrue()}"
update="currentChapters"
styleClass="full-width"/>
</b:column>
<b:column span="12">
<pe:ckEditor id="ckeditor"
rendered="#{ProjectBacking.isEdit}"
width="100%"
value="#{ProjectBacking.editorContent}">
<p:ajax event="save"
listener="#{ProjectBacking.updateProjectContent()}"
update="currentChapters" />
</pe:ckEditor>
</b:column>
</b:row>
</h:form>
</b:column>
</b:row>
</ui:define>
</ui:composition>
支持豆:
@Named("ProjectBacking")
@SessionScoped
public class ProjectsBacking implements Serializable {
private static final long serialVersionUID = 1L;
//Field Properties
private String projectName;
private ProjectContent currentContent;
private String editorContent;
private boolean isEdit;
//Data Properties
private User currentUser;
private Project project;
private List<ProjectDocument> projectDocuments;
private List<ProjectContent> projectContents;
private String testContent;
@Inject
private LoginBacking login;
@EJB
private TeamDAO teamDAO;
@EJB
private ProjectDAO projectDAO;
@EJB
private DocumentDAO documentDAO;
@EJB
private ChapterDAO chapterDAO;
@EJB
private ProjectDocumentDAO projectDocumentDAO;
@EJB
private ProjectChapterDAO projectChapterDAO;
@EJB
private ProjectContentDAO projectContentDAO;
public void onPageLoad() {
currentUser = login.getUser();
projectDocuments = projectDocumentDAO.getAllProjectDocumentsOrderedByOrderNumber();
/*
When Page first time loaded, set the content on the page
to the content of the first chapter of the first document
(which currently is "Lastenheft")
*/
if(currentUser.getTeam().getProject()!= null && currentContent == null) {
currentContent = currentUser.getTeam().getProject().getProjectDocuments().get(0).getProjectChapters().get(0).getProjectContent();
}
}
public void setIsEditTrue() {
isEdit = true;
}
public String createProject() {
project = new Project();
project.setProjectName(projectName);
project.setTeam(currentUser.getTeam());
project = this.createInitialProjectContents(project);
project = projectDAO.createProject(project);
currentUser.setTeam(teamDAO.updateTeam(currentUser.getTeam()));
return "projects?faces-redirect=true";
}
public void setCurrentContentForChapter(ProjectChapter chapter) {
currentContent = projectContentDAO.getProjectContentForProjectChapterId(chapter.getId());
editorContent = currentContent.getContent();
isEdit = false;
}
public void updateProjectContent() {
editorContent = editorContent.replaceAll("\\r|\\n", "");
currentContent.setContent(editorContent);
currentContent = projectContentDAO.updateProjectContent(currentContent);
isEdit = false;
}
}