【问题标题】:JSF composite component with duplicate code, would like to parameterize重复代码的JSF复合组件,想参数化
【发布时间】:2021-02-22 23:21:14
【问题描述】:

为了减少具有相似行为的视图之间的重复代码,我一直在使用如下复合组件:

employee_task_view.xhtml

<stk:task_table_component viewBean="#{myTaskViewImplementation}" id="taskComp" myself="true" actionColumn="false" showWaivedColumn="#{auth.userHasRole('adminStatuses')}" />

manager_roster_task_view.xhtml

<stk:task_table_component viewBean="#{managerTaskViewImplementation}" id="taskComp" myself="false" actionColumn="true" showWaivedColumn="#{auth.userHasRole('adminStatuses')}" />

传入不同的视图bean。但现在想减少复合组件本身内的重复代码。例如,我想清理基本上重复的创建和更新对话框表单,除了我是从数据表行引用selected item 还是要插入New Item

task_table_component.xhtml

     <p:dialog id="addTaskDialogId" header="Add Task #{cc.attrs.viewBean.employeeToView ne auth.employee ? ' for '.concat(cc.attrs.viewBean.employeeToView.lname) : ''}" dynamic="true"
                widgetVar="addTaskDialogWv">
          <h:form id="addTaskFormId">
               <p:outputLabel id="taskTitleLbl" value="Task Title : " for="taskTitle" />
               <p:inputText id="taskTitle" value="#{cc.attrs.viewBean.newTask.title}" />
           ...
     </p:dialog>
     <p:dialog id="editTaskDialogId" header="Edit task #{cc.attrs.viewBean.selectedTask.id}" dynamic="true" widgetVar="editTaskDialogWv">
      <h:form id="editTaskFormId">
           <p:outputLabel id="taskTitleLbl" value="Task Title : " for="taskTitle" />
             <p:inputText id="taskTitle" value="#{cc.attrs.viewBean.selectedTask.title}" />
            ...
      </p:dialog>

如何参数化 cc.attrs.viewBean.newTask.title 和 cc.attrs.viewBean.selectedTask.title 以减少到只有一个弹出 p:dialog?我发现自己重新调整了其中一个对话框布局,却发现我忘记在另一个对话框中进行相同的调整。

【问题讨论】:

  • #{cc.attrs.viewBean[cc.attrs.taskObjectName].title} 怎么样?

标签: jsf el


【解决方案1】:

我最终在要处理的对象的 中传递参数,然后 src 包含所有常见的表单标签和字段

task_table_component.xhtml

    <p:dialog id="addTaskDialogId" header="Add Task #{cc.attrs.viewBean.employeeToView ne auth.employee ? ' for '.concat(cc.attrs.viewBean.employeeToView.lname) : ''}" dynamic="true"
        widgetVar="addTaskDialogWv" modal="true">
        <h:form id="addTaskFormId">
            <ui:include src="/WEB-INF/templates/includes/task_insert_edit.xhtml">
                <ui:param name="task" value="#{cc.attrs.viewBean.newTask}" />
            </ui:include>
            <p:commandButton value="Add Task" update="addTaskFormId taskComp:taskForm messages growl" action="#{cc.attrs.viewBean.addTask()}" />
        </h:form>
    </p:dialog>

    <p:dialog id="editTaskDialogId" header="Edit task #{cc.attrs.viewBean.selectedTask.id}" dynamic="true" widgetVar="editTaskDialogWv" modal="true">
        <h:form id="editTaskFormId">
            <ui:include src="/WEB-INF/templates/includes/task_insert_edit.xhtml">
                <ui:param name="task" value="#{cc.attrs.viewBean.selectedTask}" />
            </ui:include>
            <p:commandButton value="Update" update="editTaskFormId taskComp:taskForm growl messages" action="#{cc.attrs.viewBean.updateTask()}" />

        </h:form>
    </p:dialog>

task_insert_edit.xhtml

    <p:outputLabel value="Task Title : " />
    <p:inputText value="#{task.title}" />

    <p:outputLabel value="Task Description : " />
    <p:inputTextarea value="#{task.description}" />

    <p:outputLabel value="My Priority : " rendered="#{cc.attrs.myself}" />
    <p:inputText value="#{task.employeePriority}" rendered="#{cc.attrs.myself}" />

    <p:outputLabel value="AssignerPriority : " rendered="#{not cc.attrs.myself}" />
    <p:inputText value="#{task.assignerPriority}" rendered="#{not cc.attrs.myself}" />


            ...

【讨论】:

    猜你喜欢
    • 2015-01-23
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 2013-04-22
    • 2011-06-04
    • 1970-01-01
    相关资源
    最近更新 更多