我正在尝试实现一个动画,其中一个项目在被选中后向左移动。以下代码有效。但只有大约 80% 的时间。
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();
}
});
模板
<template name="myItem">
<div class="myItem">{{name}}</div>
</template>
<template name="myItemList">
{{#each items}}
{{> myItem}}
{{/each}}
</template>
CSS
.myItem { transition: all 200ms 0ms ease-in; }
.selected { left: -20px; }
我还尝试将代码包装到 aMeteor.defer()
中,以确保一切都准备好执行动画。
Template.myItem.rendered = function(){
Meteor.defer(function() {
if(Session.get("selected_item") === this.data._id){
$(this.firstNode).addClass("selected");
} else {
$(this.firstNode).removeClass("selected");
}
});
};
但这会导致这种错误:
Exception from defer callback: TypeError {}
很高兴看到任何想法如何使动画每次都能正常工作。
更新
螃蟹得到了正确的答案。例外来自this
参考。我想补充一些细节。所以这里有两个关于如何制作动画的工作版本:
和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"
});
}
};
(我们实际上不需要 else 块,因为selected
如果流星重绘项目,它会删除该类。)
或与$().animate()
Template.myItem.rendered = function(){
if(Session.get("selected_item") === this.data._id){
$(this.firstNode).animate({
left: "-20px"
}, 300);
}
};
如果您使用 jQuery 方法,则需要删除 CSS 代码。
.myItem { transition: all 200ms 0ms ease-in; }
.selected { left: -20px; }