javascript - Meteor Animation -
i trying implement animation item animates left after gets selected. following code works. 80% of time.
js
//myitem template.myitem.rendered = function(){ if(session.get("selected_item") === this.data._id){ $(this.firstnode).addclass("selected"); } else { $(this.firstnode).removeclass("selected"); } }; template.myitem.events({ "click .myitem": function(evt, template){ session.set("selected_item", this._id); } }); //myitemlist template.myitemlist.helpers({ items: function(){ return items.find(); } });
templates
<template name="myitem"> <div class="myitem">{{name}}</div> </template> <template name="myitemlist"> {{#each items}} {{> myitem}} {{/each}} </template>
css
.myitem { transition: 200ms 0ms ease-in; } .selected { left: -20px; }
i tried wrap code meteor.defer()
make sure ready animation.
template.myitem.rendered = function(){ meteor.defer(function() { if(session.get("selected_item") === this.data._id){ $(this.firstnode).addclass("selected"); } else { $(this.firstnode).removeclass("selected"); } }); };
but results in kind of error:
exception defer callback: typeerror {}
it great see ideas how make animation work every time.
update
krab got right answer. exception coming this
reference. want add details. here 2 working versions on how animation:
with meteor.defer()
template.myitem.rendered = function(){ var instance = this; if(session.get("selected_item") === this.data._id){ meteor.defer(function() { $(instance.firstnode).addclass("selected"); //use "instance" instead of "this" }); } };
(we don't need else block here because meteor remove selected
class if redraws item.)
or $().animate()
template.myitem.rendered = function(){ if(session.get("selected_item") === this.data._id){ $(this.firstnode).animate({ left: "-20px" }, 300); } };
if use jquery approach need remove css code.
.myitem { transition: 200ms 0ms ease-in; } .selected { left: -20px; }
try this, because this
pointer in defer callback isn't same if code executed directly in rendered callback
template.myitem.rendered = function(){ var self = this; meteor.defer(function() { if(session.get("selected_item") === self.data._id){ $(self.firstnode).addclass("selected"); } else { $(self.firstnode).removeclass("selected"); } }); };
Comments
Post a Comment