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.