2013-07-06 111 views
0

根據Meteor文檔,將在template_name的每個實例已完成呈現後執行分配給Template.template_name.rendered的回調。我一直在嘗試使用此功能的jQuery插件(如TagsManager或DotDotDot)連接到由模板生成的DOM元素。 「自然」的方式來做到這一點會是這樣的:將jQuery插件附加到Meteor模板生成的DOM元素

Template.template_name.rendered = function() { 
    var template = this; 
    var elem = $('input#tags'+template.data._id); 
    elem.tagsManager(); // doesn't work 
} 

但是,這並不工作 - 預期行爲不出來附屬的元素。 jQuery選擇器正常工作,並通過記錄tagsManager()的內部,我可以看到事件處理程序確實似乎被連接,但在.tagsManager()完成後,它們以某種方式未連接。

$(document).ready或短setTimeout包裝代碼的「通常」的解決方案,從完全相同的行爲遭遇:

Template.template_name.rendered = function() { 
    var template = this; 
    $(document).ready(function() { 
     window.setTimeout(function() { 
      var elem = $('input#tags'+template.data._id); 
      elem.tagsManager(); 
     }, 100); // 0.1 seconds + $(document).ready doesn't work 
    }); 
} 

我只得到它通過提供一個不切實際的高setTimeout時間來工作,如3秒:

Template.song.rendered = function() { 
    var template = this; 
    console.log("Template for "+template.data.title+" created"); 
    $(document).ready(function() { 
     window.setTimeout(function() { 
      var elem = $('input#tags'+template.data._id); 
      elem.tagsManager(); 
     }, 3000); // 3 seconds + $(document).ready works 
    }); 
} 

作爲事實上,即使通過從相同的行爲的簡單elem.on('click',...)患有替換elem.tagsManager()如上所述 - 這就是爲什麼人s的流星給了我們Template.template_name.events,我猜。然而,這種斷裂的所有有趣的插件,並迫使我們依靠哈克,危險的代碼,如上述。有沒有更好的辦法?

回答

1

在模板中,換要與{{#constant}}助手應用jQuery的股利。這會殺死你對元素包裝的所有反應。

如果您需要反應性或常量沒有幫助,嘗試this hack。我在調用渲染時解除綁定元素的事件並在之後綁定它。在這種情況下的問題是,呈現被稱爲像一個十幾次,它搞砸了一些方法,我還沒有想出。嘗試對其進行調試,以查看第一行渲染中調用console.log的次數。

希望它有幫助!

+0

嘿@gabrielhpugliese,在連接插件之前解除焦點工作!不知道爲什麼,但它確實! –

+0

hehehe酷! :) – gabrielhpugliese

相關問題