2012-02-23 2 views
1

私はすべての製品を示す以下の繰り返し制御を持っている:パフォーマンスを向上させるために、コントロールを繰り返し、dbとviewを渡しますか?

getImgURLForProductは別のデータベースからURLを構築します
<xp:repeat id="rptProduct" rows="16" value="#{vwProduct}" 
     var="productRow"> 
     <xp:panel styleClass="linkPanel" id="panel1"> 
      <xp:text escape="false" id="imgHTML"> 
       <xp:this.value><![CDATA[#{javascript:getImgURLForProduct(productRow.getDocument());}]]></xp:this.value> 
      </xp:text> 
      <xp:eventHandler event="onClientLoad" 
       submit="true" refreshMode="norefresh"></xp:eventHandler></xp:panel> 
</xp:repeat> 

function getImgURLForProduct(doc:NotesDocument) { 
    var resourceDB:NotesDatabase = session.getDatabase(getWebServer(), applicationScope.aspCRMResourceDBPath); 
    var strReturnVal:String = "<a style='text-decoration: none;' href='#'>"; 

    if (resourceDB != null) { 
     if (resourceDB.isOpen()) { 
      var vwResource:NotesView = resourceDB.getView("vwLookupAttachmentsForPrimaryImg"); 

      if (vwResource != null) { 
       var pictureDoc:NotesDocument = vwResource.getDocumentByKey(doc.getItemValueString("fldProductCode"), true); 

       if (pictureDoc != null) { 
        if (pictureDoc.hasItem("fldThumbImage")) { 
         var rtiLockPicture:NotesRichTextItem = pictureDoc.getFirstItem("fldThumbImage"); 

         var eos:java.util.Vector = rtiLockPicture.getEmbeddedObjects(); 

         if (eos.isEmpty() == false) { 
          var eosi:java.util.Iterator = eos.iterator(); 

          while (eosi.hasNext()) { 
           var eo:NotesEmbeddedObject = eosi.next(); 

           if (eo.getType() == NotesEmbeddedObject.EMBED_ATTACHMENT) { 
            var strImageFile:String = "/" + applicationScope.aspCRMResourceDBPath + "/0/" + pictureDoc.getUniversalID() + "/$file/" + eo.getSource(); 
            strReturnVal += "<img src='" + strImageFile + "' alt='" + eo.getSource() + "' border='0' width='105'>"; 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

    strReturnVal += "<br /><br /><span>" + doc.getItemValueString("fldProductCode") + "</span>"; 
    strReturnVal += "</a>"; 
    return strReturnVal; 
} 

私はそのようにデシベルコードを向上させることができどのように思っていましたビューは、繰り返し制御内の各アイテムごとに初期化されていませんか?

答えて

3

別のデータベースのビューをdataContextに格納することができます。私は、リサイクルに安全なdataContextがどのようになっているのかよく分かりませんが、Dominoオブジェクトをそこに格納することは安全です。 dataContextについては、Mastering XPagesには良いセクションがあります。それは私にとって非常に便利でした。

+0

ありがとうポール - 非常に感謝しています - それをさらに調査し、コードを改善できるかどうかを確認します。 – pipalia

+0

それは働いた!ありがとうポール、非常に感謝します。 – pipalia

1

文書データを取り出すデータベースのnotesviewを変更するのが最善の方法です。このビューには、必要なすべてのデータ(ofc。richtextの値を除く)とその上に、このコードで生成する計算されたURLを含む列が含まれています。そうすることで、参照しているすべてのドキュメントに対してセカンダリデータベースを開く必要はありません。

もう1つのアプローチは、いくつかのキャッシュ手段を追加してコードを改善することです。 getImageFromUrlメソッドが常に同じデータベースなど(同じサーバーなど)を開く場合は、このように変更することができます。あなたがデータベースを再び開く必要がいけない参照されているドキュメントのために利用可能なキャッシュエントリがある場合は、最初のチェックでは

function getImgURLForProduct(doc:NotesDocument) { 
     var docid = doc.getUniversalID(); 
if(inCache(docID){ 
    return fromCache(docid); 
} 

     var resourceDB:NotesDatabase = session.getDatabase(getWebServer(), applicationScope.aspCRMResourceDBPath); 
     var strReturnVal:String = "<a style='text-decoration: none;' href='#'>"; 

     if (resourceDB != null) { 
      if (resourceDB.isOpen()) { 
       var vwResource:NotesView = resourceDB.getView("vwLookupAttachmentsForPrimaryImg"); 

       if (vwResource != null) { 
        var pictureDoc:NotesDocument = vwResource.getDocumentByKey(doc.getItemValueString("fldProductCode"), true); 

        if (pictureDoc != null) { 
         if (pictureDoc.hasItem("fldThumbImage")) { 
          var rtiLockPicture:NotesRichTextItem = pictureDoc.getFirstItem("fldThumbImage"); 

          var eos:java.util.Vector = rtiLockPicture.getEmbeddedObjects(); 

          if (eos.isEmpty() == false) { 
           var eosi:java.util.Iterator = eos.iterator(); 

           while (eosi.hasNext()) { 
            var eo:NotesEmbeddedObject = eosi.next(); 

            if (eo.getType() == NotesEmbeddedObject.EMBED_ATTACHMENT) { 
             var strImageFile:String = "/" + applicationScope.aspCRMResourceDBPath + "/0/" + pictureDoc.getUniversalID() + "/$file/" + eo.getSource(); 
             strReturnVal += "<img src='" + strImageFile + "' alt='" + eo.getSource() + "' border='0' width='105'>"; 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 

     strReturnVal += "<br /><br /><span>" + doc.getItemValueString("fldProductCode") + "</span>"; 
     strReturnVal += "</a>"; 
     toCache(strReturnVal); 
     return strReturnVal; 
    } 

function inCache(strKey){ 
    if(!sessionScope.containsKey("urlcache")){ 
    sessionScope.put("urlcache",new java.util.HashMap()); 
} 
    var cache = sessionScope.get("urlcache"); 
    cache.containsKey(strKey); 
} 

function fromCache(strKey){ 
    var cache = sessionScope.get("urlcache"); 
    return cache.get(strKey); 
} 

function toCache(strKey,strValue){ 
    if(!sessionScope.containsKey("urlcache")){ 
    sessionScope.put("urlcache",new java.util.HashMap()); 
} 
    var cache = sessionScope.get("urlcache"); 
    cache.put(strKey,strValue); 
} 

);

このコードを警告しても、warantyせずに来て、何ハンドリングエラーがありません。

+0

両方のオプションをありがとう。最初のオプションでは、pictureDocが保存されるときにURLを生成する必要があります。それに応じて値を推測して更新します。これは良い回避策です。 2番目の提案は面白いです!ありがとうございました。 – pipalia

+0

私は、Paulの提案に基づくデータコンテキストと、結果をキャッシュするための2番目の提案とを組み合わせることに決めました。 – pipalia

+0

私はまたコードの問題を修正しました:var docID:String = doc.getUniversalID(); if(inCache(docID)){ return fromCache(docID); } および toCache(docID、strReturnVal); – pipalia

関連する問題