2014-01-07 52 views
0

我有一個可排序的列表。模板的重新渲染不允許我永久更改元素的類?

<template name="the_playlist"> 
     {{#each main_list}} 
      <li id="{{index}}" class="list_element"> 
       <div class="next_song">...</div> 
       <div class="destroy">...</div> 
       <div class="element_style">{{song_title}}</div> 
      </li> 
     {{/each}} 
</template> 

而這是從它打印的main_list

Template.the_playlist.main_list = function(){ 
    //if ret is valid, it will have a songs member 
    var ret = Links.find().fetch()[0]; 
    if (typeof ret == 'undefined'){ 
     ret = [] 
    } 
    else { 
     ret = Links.find().fetch()[0].songs; 
    } 
    return ret; 
} 

,我使用的排序插件,更重要的是其update回調哪些更新,每次用戶改變位置的列表或一個元素被添加到列表中。

$(function() { 
    $("#playlist").sortable({ 
    update: function(){ 
    Template.list.updateList(); //MODIFIES DB CONTENTS, AND MAIN_LIST's VALUES CHANGE 
    }}); 
    $("#playlist").disableSelection(); 
    }); 

* 問題:如果當它的加載,僅一次一個網頁已有列表中的元素,我想補充一類皮(.addClass("hide"))*每個next_song元素上的當時的頁面。這個*只能在main_list改變之前工作,通過上面的Template.list.updateList的調用,之後自動地,添加的類將消失 - 很可能是由於main_list取決於db更改而發生的重新呈現。

以下是我用來嘗試完成此操作的JQuery代碼片段。

$("#playlist li .next_song").each(function(){ 
    $(this).addClass("hide_song"); 
}) 

Here is a demo. Try plugging in the above JQUery code into the console. and then move the list elements around to see the problem.

回答

0

難道你們就不能只是確定是否這將是一個輔助函數的情況下?

Template.the_playlist.helpers({ 
    'list_elements_exist': function() { 
     return (!!$('#playlist li').length); 
    } 
} 

然後,你可以插入邏輯直入模板:

<div class="next_song{{#if list_elements_exist}} hide_song{{/if}}">...</div> 

說實話,我不是100%肯定,這將與浮動取決於你的應用程序的結構反應。如果它不能正常工作,我會引入一個新的會話布爾值,list_elements,其值由上面的幫助器函數返回。在事件處理程序或created回調中更新它的值應該相當容易,以便跟蹤列表中是否有任何項目,並且這將確保列表根據需要進行呈現,而不管其他依賴項是否更改。