2012-12-30 66 views
0

在我的webapp中,我需要創建一些具有不同內容的相同塊(某些文本,評級,某些按鈕)(即文本和評分不同,按鈕ID是不同的)。爲此,我使用jQuery模板。jQuery模板,將jQuery插件應用於每個模板項目

同時,對於評價,我使用「Raty」jQuery插件。它將評分顯示爲填充星號和空星號的數量,並且在模板填充數據時應將值傳遞給它。

但是,我找不到在模板處理時將插件應用於相應div的方法。

這是代碼。

  1. 模板
     
    <script id="clientTemplate" type="text/html"> 
        <span class="firstline" id="firstline_${id}">${firstline} 
        <div class="star" id="s_${id}" style="cursor: pointer; width: 100px;"></div> 
        {{if unescape(alert($data.importance) )}}{{/if}} 
        </span> 
    </script> 
    
    //警告是有隻是爲了檢查我們能夠訪問所需數據
  2. 這是我們需要應用到star DIV:
     
    $(".star").raty({ 
        half : true, 
        score : 2.5, 
        readOnly : false, 
        click : function(score, evt) { 
         if (readonly) { 
          return false; 
         } 
         _id = $(this).attr("id"); 
         _id = id.replace("s", ""); 
         _id = _id.trim(); 
          $.ajax({ 
           url : "importancereceive.html", 
           type : "POST", 
           data : { 
           id : _id, 
           importance : score 
          }, 
          success : function(data) { 
           if (data != "1") { 
            alert("Failed to mark plan as completed"); 
           } 
          }, 
          error : function(jqXHR, textStatus, errorThrown) { 
           alert("error: " + textStatus); 
           alert("error: " + errorThronwn); 
          } 
         }); 
        } 
    }); 
    
    //我需要更換score值從低於
  3. 而這裏importance值是數據
     
    <script> 
        var clientData = [ { 
         id : 1, 
         firstline : "My first line", 
         importance : 2.0 
        } ]; 
    </script> 
    

我怎樣才能將這個插件應用於star div的每個生成?據我所知,知道我可以迭代整個DOM的項目ID並將具體的importance值設置爲特定的star div,但這意味着需要多次遍歷整個DOM,這可能會給手機/平板電腦帶來問題尤其是,如果列表變大。有沒有辦法將這件事情應用到div中?

+0

'迭代整個DOM很多次'是錯誤的。模板html不是在DOM中創建的,並且一旦處理完所有數據,DOM中只會創建一個插入。在生成的html插入之前調用插件 – charlietfl

+0

@charlietfl問題是我不明白。也就是說,我可以將插件應用到生成的HTML($(「.star」)。raty(...)),但我不明白如何爲每個div設置正確的分數值。順便說一句,$(this).data(..)甚至$(this).attr(..)在那裏不起作用。 – Ibolit

回答

1

與許多依賴每個實例的特定數據的插件一樣,您必須遍歷元素才能將正確的數據應用到每個實例。

使用模板

$('.star').each(function(){ 
    var score=$(this).data('score') 
    $(this).raty({ 
      half : true, 
      score : score, 
      /* other options*/ 
    }); 
}); 

你的模板引擎應該給你訪問它插入之前,它產生的HTML正如上面所提到存放在data-屬性的分數。

您可以調用它生成的html上的插件,也可以在插入DOM之前循環該html。

某些模板引擎在處理這個問題上稍微靈活一些。這取決於使用的模板系統

+0

是的,這只是我終於來到的解決方案。 – Ibolit

1

將重要性存儲在div的自定義屬性中是不是一個想法?

所以,你的模板將成爲類似:

<script id="clientTemplate" type="text/html"> 
    <span class="firstline" id="firstline_${id}">${firstline} 
    <div class="star" id="s_${id}" style="cursor: pointer; width: 100px;" data-importance="${importance}"></div> 
    {{if unescape(alert($data.importance) )}}{{/if}} 
    </span> 
</script> 

(我想這是這樣的事情,我不知道你的模板語言)

又見Is it OK to add your own attributes to HTML elements?有關創建更多信息你自己的屬性。

然後你可以使用 $(this).attr("data-importance")得到你的重要性。

編輯:然後你可以使用$(this).data("importance")得到你的重要性。 (請參閱source

+0

是的,但是在「raty」插件中設置爲「score」的值然後被表示爲填充星形(例如,如果將其設置爲2.4,則將填充2.5個星形,並且剛剛列出2.5個星形,即中間的那個將會是半滿的) – Ibolit

+0

無論如何,這樣我將需要第二次遍歷DOM,並且分數設置邏輯將與模板分離,但我希望它在那裏。謝謝你的回覆,雖然:) – Ibolit

+0

我試過這個解決方案,但$(this).data(「importance」)返回「undefined」。原來,$(this)[0]指的是窗口。 「這個」也是。 – Ibolit