Skip to main content

Meteor: Run/Bind JavaScript after rendering a template elements

Being studying Meteor myself I'd like to help beginners like me. I have searched for certain decisions that became wired to me after python development. So I'll just leave them here for your consideration.

Imagine a situation when you need to bind your plugins to a newly rendered template. If you are diving into asynchronous JS dev, like I did and have developed AJAX websites... You will, one word, be quite confused because main concepts are different from the one's you used to know. Anyhow I'd try to explain on this simple task.

Assume we have a template:
<template name="site-part">
  <p>{{my-text}}</p>
</template>
And I render it's content like so:
Template.site-part.content = function() {
  return Session.get("my_data");
}
So I have this template piece rendered when "my_data" variable appears in session. And I have events binded to newly rendered webpage:
Template.site-part.events = {
  'click input': function (e,r) {
  // my scripts
  },
  ....
}
So when my page is rendered I'm binding the events to certain DOM elements. This is all good, unless you would need to attach some plugin to your newly rendered DOM elements. E.g. on rendering this <p> element please execute those scripts. In a jQuery world and simple AJAX web pages you would just add a .live() or .on() or even .load() and so on functions that would trigger those your JavaScript code on it's creation in a DOM. It may work in some cases. But Meteor has fansy trigger to bind your code exactly after template is rendered. It is described on a meteor docs page: http://docs.meteor.com/#template_rendered. But I'll make some example here for better understanding:
Template.site-part.rendered = function() {
  $('p').tooltip();
}
This is a .rendered function after main template name. All magic happens there. Line up your jQuery code and bind your events and plugins there.

This .tooltip() is a binding of a simple JavaScript plugin from a bootstrap package. And is here just only for example of of a common task. E.g. animation of elements after rendering. Like adding a tooltip for them after rendering a Meteor template. Hope this all makes sense to you and will help sometime.

Comments? I'm wrong? Suggestions?

Comments

  1. I'm trying to include an external script with a recaptcha in the in a form in the HTML template. The script tag src looks like:
    src="http://www.google.com/recaptcha/api/challenge?k=6LcBoO8SAAAAAKNgu2AWLuAiqzgM0CSAywJJzCwU"
    Can you please help me with and advice to make this work in Meteor?

    ReplyDelete
    Replies
    1. I do not think it's a straightforward decision. You should use another type of recapcha binding. E.g. with separated html template and JS part. So you could bind the JS after template is rendered.

      Delete
    2. Thank you for your answer, I will use the JS binding after the template is rendered!

      Delete
  2. This was super helpful, thanks! One note: be sure to define your template as narrowly as possible. This is necessary if using nested templates or an instance template (listing from a collection). I stumbled on that one.

    ReplyDelete

Post a Comment

Popular posts from this blog

Pretty git Log

SO you dislike git log output in console like me and do not use it... Because it looks like so: How about this one? It's quite easy... Just type: git log - - graph - - pretty = format : '%Cred%h%Creset -%C ( yellow ) %d%Creset %s %Cgreen ( %cr) %C ( bold blue ) <%an>%Creset' - - abbrev - commit - - It may be hard to enter such an easy command every time. Let's make an alias instead... Copypaste this to your terminal: git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --" And use simple command to see this pretty log instead: git lg Now in case you want to see lines that changed use: git lg - p In order for this command to work remove  the -- from the end of the alias. May the code be with you! NOTE: this article is a rewritten copy of  http://coderwall.com/p/euwpig?i=3&p=1&t=git   and have b

Django: Resetting Passwords (with internal tools)

I have had a task recently. It was about adding a forms/mechanism for resetting a password in our Django based project. We have had our own registration system ongoing... It's a corporate sector project. So you can not go and register yourself. Admins (probably via LDAP sync) will register your email/login in system. So you have to go there and only set yourself a password. For security reasons you can not register. One word. First I've tried to find standart decision. From reviewed by me were: django-registration and django password-reset . These are nice tools to install and give it a go. But I've needed a more complex decision. And the idea was that own bicycle is always better. So I've thought of django admin and that it has all the things you need to do this yourself in no time. (Actually it's django.contrib.auth part of django, but used out of the box in Admin UI) You can find views you need for this in there. they are: password_reset password_reset_

Time Capsule for $25

The real article name might be something like:  Configuring Raspbery Pi to serve like a Time Capsule with Netatalk 3.0 for Mountain Lion.  But it's too long ;) Here I will describe the process of using Raspberry Pi like a Time Machine in my network. To be able to backup your MAC's remotely (Like it would be NAS of some kind). It assumes you have a Raspberry Pi and have installed a Raspbian there and have a ssh connection, or somehow having access to it's console. Refer to my previous article for details . Now that we have a Pi that is ready for action let's animate it. So to make it suit you as a Time Capsule (NAS) for your MAC's you need to do those basic steps: - connect and configure USB hard drive(s) - install support of HFS+ filesystem to be able to use MAC's native filesystem - make mount (auto-mount on boot) of your hard drive - install Avahi and Netatalk demons - configure Netatalk daemon to make it all serve as a Time Machine - configure