2013-07-06 37 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