7

我正在尝试实现一个动画,其中一个项目在被选中后向左移动。以下代码有效。但只有大约 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; }

4

1 回答 1

3

试试这个,因为this延迟回调中的指针与直接在渲染回调中执行代码不同

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");
    }
  });
};
于 2013-07-18T09:53:56.363 回答