渲染流星模板后运行JS

时间:2012-06-13 19:38:10

标签: meteor

我有一个看起来像这样的模板:

<template name="foo">
  <textarea name="text">{{contents}}</textarea>
</template>

我用:

渲染它
Template.foo = function() {
  return Foos.find();
}

我有一些事件处理程序:

Template.foo.events = {
  'blur textarea': blurHandler
}

我想要做的是设置rows的{​​{1}}属性,具体取决于其内容的大小。我意识到我可以写一个Handlebars帮助器,但它不能访问正在渲染的DOM元素,这会迫使我做一些不必要的重复。理想情况下,我想要的是流星在渲染元素后触发事件。类似的东西:

textarea

这可能吗?

4 个答案:

答案 0 :(得分:20)

从Meteor 0.4.0开始,可以检查模板是否已完成渲染,请参阅http://docs.meteor.com/#template_rendered

如果我理解你的问题,你应该将你的textarea resize代码包装在Template.foo.onRendered函数中:

Template.foo.onRendered(function () {
  this.attach_textarea();
})

答案 1 :(得分:16)

我认为当前“最好”的方式(这有点像黑客)是使用Meteor.defer ala Callback after the DOM was updated in Meteor.js

Geoff是流星开发者之一,所以他的话就是福音:)

因此,在您的情况下,您可以执行以下操作:

 <textarea id="{{attach_textarea}}">....</textarea>

 Template.foo.attach_textarea = function() {
   if (!this.uuid) this.uuid = Meteor.uuid();

   Meteor.defer(function() {
     $('#' + this.uuid).whatever();
   });

   return this.uuid;
 }

修改

请注意,作为0.4.0,你可以采用一种特别的方式(如Sander所指出的那样):

Template.foo.rendered = function() {
  $(this.find('textarea')).whatever();
}

答案 2 :(得分:2)

自2014年6月左右以来,正确的方法是使用Template.myTemplate.onRendered()设置回调。

答案 3 :(得分:0)

是的,我想是这样 - 不确定它是否是“正确的方式”,但这对我有用:

在你的应用程序JS中,客户端部分将运行客户端上的任何javascript。例如:

if (Meteor.is_client) {
    $(function() {
        $('textarea').attr('rows' , 12) // or whatever you need to do
    })
    ...

注意这里的示例使用JQuery,在这种情况下,您需要将此提供给客户端(我认为:-)。就我而言:

我创建了一个/ client目录,并在此下添加了jquery.js文件。

希望这有帮助。