I had this following code:
@collection.each (post) ->
$(@el).append @template(post.attributes)
@
I was running in an issue where @el and @template were returning Uncaught TypeError: undefined is not a function. I even created a StackOverflow question about it.
I got the template to render by using jQuery directly like so,
$('#posts').append _template.( $('#home-post-template').html() ).
So this told me that the el or template was not within the scope of the each function. I remembered I was originally referencing one of Buzzstarter’s Backbone files and I had => instead of the -> I had now. Just trying things, I switched out -> for =>. Now it was working. Of course I couldn’t switch it out without understanding why it made a difference. So to the CoffeeScript documentation about the fat-arrow. It basically passes another function passing the outer context of this into an argument. This can be better illustrated with the conversion of CoffeeScript to normal Javascript
Old CoffeeScript
@collection.each (post) ->
$(@el).append(@template(post.attributes))
@
Javascript Equivalent
this.collection.each(function(post) {
return $(this.el).append(this.template(post.attributes));
});
return this;
New CoffeeScript
@collection.each (post) =>
$(@el).append(@template(post.attributes))
@
Javascript Equivalent
this.collection.each((function(_this) {
return function(post) {
return $(_this.el).append(_this.template(post.attributes));
};
})(this));
return this;
Once I saw the Javascript of the CoffeeScript with =>, it was painfully obvious what I was doing wrong and how => solved the problem. This error was due to my unfamiliarity to CoffeeScript, but Js2Coffee is quite useful in learning the differences.