2017-03-25 78 views
0

我想從2天開始解決我的primefaces圖實現中遇到的問題。 我想在「鼠標懸停」圖表元素上突出顯示與該元素相關的其他元素。 我有它的工作,但只有當我更新整個圖/表格時,我更新的元素。 我有這種方法的兩個問題。 首先,鼠標懸停在鼠標懸停上的所有綁定不斷更新,得到重置,所以我有事件發生,但我只是進入。還有80%的時間我不會捕捉mouseleave/hover事件,因爲不斷的調用。 此外,我不能滾動圖表,因爲鼠標懸停上的不斷更新會重置滾動。 ;-)正在更新某些Primefaces圖元素

於是,我就只更新我其實鼠標懸停改變了圖元素,但我找不到我嘗試了通過primefaces RequestContect updateing元素的方式,爲我工作...

。更新 我用於Id等的所有變化: 1-0201 圖-1-0201 圖:圖-1-0201

我嘗試一個JavaScript查詢從primefaces執行。我得到了一個你不能解決的錯誤。儘管相同的查詢適用於xhtml。我也無法弄清楚那個錯誤。雖然我不認爲這會有所幫助,因爲相同的代碼在HTML文件中執行時也不起作用。

我試着只保存圖元素值中的連接,然後通過元素上的隱藏輸入來訪問這個值。我在javascript中獲得了連接元素的ID,但我無法通過JavaScript更新元素。 「裏面」(剩下的評論代碼)是我用於存儲連接的Element變量引用的隱藏輸入的變量) 我在javascript中獲得了列表和單個連接的id,但無法管理更新元素。

我不是那種在javascript中經歷過的。我幾天前第一次使用它。

那麼如何在不重新加載孔圖的情況下更新primefaces圖中某些元素的樣式呢? 必須有一個非常簡單的方法來做到這一點,或一個簡單的方法來解決我的方法,我只是不能看到。 它正在工作,如果我更新整個圖,正如我所說的,但我無法做到這一點mouseover出於顯而易見的原因。

我使用primefaces 6.0具有的Apache Tomcat 8.5

圖片設置的與IDS:http://i.imgur.com/9yTEabE.png

的JavaScript日誌事件的圖片:http://imgur.com/mCgf0BU

我的XHTML文件:

<!DOCTYPE html> 
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core"> 
<h:head> 
    <p:panelGrid columns="2" styleClass="borderless"> 
     <h:graphicImage name="images/logo.gif" /> 
     <h:outputLabel styleClass="h1" value="Diagram Viewer" /> 
    </p:panelGrid> 
    <f:metadata> 
     <f:viewAction action="#{dataManager.onLoad}" /> 
    </f:metadata> 
</h:head> 
<h:body> 
    <h:form id="tabMenuForm"> 
     <p:menubar styleClass=".ui-menu .ui-menuitem-link" 
      model="#{dataManager.menuModel}" /> 
    </h:form> 
    <h:form id="diagramForm"> 
     <p:dialog widgetVar="statusDialog" modal="true" draggable="false" 
      closable="false" resizable="false" showHeader="false"> 
      <p:graphicImage value="#{resource['images/defaultLoader.gif']}" /> 
     </p:dialog> 
     <p:tooltip /> 
     <p:diagram id="diagram" value="#{dataManager.model}" 
      styleClass="borderless" style="#{dataManager.diagramStyle}" var="el"> 
      <f:facet name="element" id="diagramElement" widgetVar="element"> 
       <h:outputLabel> 
        <p:commandLink 
         actionListener="#{tooltipManager.onElementClickedTwo()}" 
         styleClass="commandRemover"> 
         <f:param name="selected" value="#{el.id}" /> 
         <div class="elID"> 
          <h:outputText value="#{el.id}" /> 
         </div> 
         <div class="elName"> 
          <h:outputText value="#{el.name}" sytleCLass="elName" /> 

         </div> 
        </p:commandLink> 
       </h:outputLabel> 
       <!-- <h:outputText value="#{el.role}" style="display: inline; align-items: right; margin-top:0em;"/> --> 

      </f:facet> 
     </p:diagram> 
     <p:remoteCommand name="elementMouseOver" 
      actionListener="#{dataManager.onElementMouseOver}" /> 
     <p:remoteCommand name="elementMouseOut" 
      actionListener="#{dataManager.onElementMouseOut}" /> 
     <h:inputHidden id="someId" value="#{dataManager.selectedId}" /> 
     <script type='text/javascript'> 
      $('.ui-diagram-element').hover(function(ev) { 
       var id = $(this).attr('id'); 
       console.log(ev); 
       var id = $(this).attr('id'); 
       //var inputs = $(this).find('input'); 
       //console.log('INSIDE!' + inputs); 
       //var input = inputs[0].val(); 
       //var val = $(input).val(); 
       //console.log('VAL: ' + val); 
       //console.log('INSIDE!' + input); 
       //var string = '#diagramForm\\:diagram-' + input; 
       //$(string).addClass('ui-diagram-element-predecessor'); 
       //+ val[i])); 
       elementMouseOver([ { 
        name : 'elementId', 
        value : id 
       } ]); 
       //console.log(val); 
      }, function(ev) { 
       //***leave***// 
       var id = $(this).attr('id'); 

      }); 
     </script> 

豆的重要部分:

private DiagramNode selected; 
    private String selectedId = "x"; 
    private List<String> selectedList = new ArrayList<String>(); 

    public String getSelectedId() { 
     return selectedId; 
    } 

    public void setSelectedId(String selectedId) { 
     this.selectedId = selectedId; 
    } 

    public List<String> getSelectedList() { 
     return selectedList; 
    } 

    public void setSelectedList(ArrayList<String> selectedList) { 
     this.selectedList = selectedList; 
    } 

    public void onElementMouseOver() { 
     String input = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("elementId"); 
     System.out.println("DataManager: Input: " + input); 
     String[] mouseoverIdSplit = input.split("-", 2); 
     if (mouseoverIdSplit.length < 2) 
      return; 

     System.out.println("DataManager: Mouseover:" + mouseoverIdSplit[1]); 

     selected = DataLoader.WPCPTaskRows.get(mouseoverIdSplit[1]); 
     selectedId = mouseoverIdSplit[1]; 
     selectedList = selected.connections; 
     for (String id : selected.connections) { 

      System.out.println("Setting StyleClass for " + id); 
      String elementToUpdate = "diagramForm:diagram-" + id; 
      System.out.println(elementToUpdate); 
      RequestContext.getCurrentInstance().update(elementToUpdate); 


      RequestContext.getCurrentInstance() 
        .execute("$('#" + elementToUpdate + "').addClass(ui-diagram-element-predecessor);"); 
     } 

     // RequestContext.getCurrentInstance().update("scriptBean"); 
     // RequestContext.getCurrentInstance().update("someId"); 
     RequestContext.getCurrentInstance().update("diagramForm"); 
     RequestContext.getCurrentInstance().update("diagram"); 

    } 

public class DiagramElement implements Serializable { 

     /** 
     * 
     */ 
     private static final long serialVersionUID = 1L; 
     private String name; 
     private String id; 
     private String role; 
     private String predecessor; 
     private List<String> predecessorList; 

     public DiagramElement() { 
     } 

     public DiagramElement(String name, String id, String role, String predecessor, List<String> predecessorList) { 
      this.name = name; 
      this.id = id; 
      this.role = role; 
      this.predecessor = predecessor; 
      this.predecessorList = predecessorList; 
     } 

+getter and setter 

回答

0

經過了10多個小時的精神錯亂,我終於找到了工作。 我連接了JavaScript中的ID字符串不正確。 另外,我不得不在字符串中添加3 \\,因爲1被吞下作爲一個轉義,我需要2個javascript函數才能找到裏面有「:」的元素。

這裏是我是如何做到的到底:

<h:inputHidden value="#{el.predecessorList}" /> 
$('.ui-diagram-element').hover(
         function(ev) { 
          var id = $(this).attr('id'); 
          console.log(ev); 
          var id = $(this).attr('id'); 
          var inputs = $(this).find('input'); 
          console.log(inputs); 
          var input = inputs[1]; 
          //var val = $(input).val(); 
          //console.log('VAL: ' + val); 
          var array = input.value; 
          console.log(array); 
          var parsedArray = array.replace("[", "").replace("]", 
            "").replace(/\s/g, "").split(','); 
          for (var pos in parsedArray) { 
           var str1 = '#diagramForm\\\:diagram-'; 
           var str2 = parsedArray[pos]; 
           console.log(str2); 
           var con = str1.concat(str2); 
           console.log(con); 
           $(con).addClass('ui-diagram-element-predecessor'); 
          } 
         }, 
         function(ev) { 
          //***leave***// 
          var id = $(this).attr('id'); 
          console.log(ev); 
          var id = $(this).attr('id'); 
          var inputs = $(this).find('input'); 
          console.log(inputs); 
          var input = inputs[1]; 
          //var val = $(input).val(); 
          //console.log('VAL: ' + val); 
          var array = input.value; 
          console.log(array); 
          var parsedArray = array.replace("[", "").replace("]", 
            "").replace(/\s/g, "").split(','); 
          for (var pos in parsedArray) { 
           var str1 = '#diagramForm\\\:diagram-'; 
           var str2 = parsedArray[pos]; 
           console.log(str2); 
           var con = str1.concat(str2); 
           console.log(con); 
           $(con).removeClass('ui-diagram-element-predecessor'); 
          } 
    });