渲染流星模板后运行JS

Tre*_*ham 9 meteor

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

<template name="foo">
  <textarea name="text">{{contents}}</textarea>
</template>
Run Code Online (Sandbox Code Playgroud)

我渲染它:

Template.foo = function() {
  return Foos.find();
}
Run Code Online (Sandbox Code Playgroud)

我有一些事件处理程序:

Template.foo.events = {
  'blur textarea': blurHandler
}
Run Code Online (Sandbox Code Playgroud)

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

Template.foo.events = {
  'render textarea': sizeTextarea
}
Run Code Online (Sandbox Code Playgroud)

这可能吗?

San*_*ker 20

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

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

Template.foo.onRendered(function () {
  this.attach_textarea();
})
Run Code Online (Sandbox Code Playgroud)


Tom*_*man 16

我认为当前"最好"的方法(这有点像黑客攻击)是在Meteor.js中更新DOM后使用Meteor.deferala Callback.

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

所以在你的情况下,你可以这样做:

 <textarea id="{{attach_textarea}}">....</textarea>
Run Code Online (Sandbox Code Playgroud)

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

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

   return this.uuid;
 }
Run Code Online (Sandbox Code Playgroud)

编辑

请注意,作为0.4.0,您可以通过特别的方式执行此操作(如Sander所指出的):

Template.foo.rendered = function() {
  $(this.find('textarea')).whatever();
}
Run Code Online (Sandbox Code Playgroud)