2013-07-18 118 views
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; } 

我也試圖代碼封裝成Meteor.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 {} 

這將是非常高興看到任何想法如何每次都使動畫作品。

UPDATE

Krab得到正確的答案。例外來自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); 
    } 
}; 

如果你使用,你需要刪除的CSS代碼jQuery的方法。

.myItem { transition: all 200ms 0ms ease-in; } 
.selected { left: -20px; } 

+0

所以呈現回調直接執行this指針在延遲迴調是不一樣的在某些東西被渲染時被調用,所以爲什麼在選擇某些東西時應該調用它?我們應該得到更多的代碼。 – Krab

+0

呈現的回調呼籲​​每'Session.set( 「selected_item」,身份證);'。我添加了一些代碼以使整體上下文更加清晰。 –

回答

3

試試這個,因爲如果代碼中呈現回調

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"); 
    } 
    }); 
}; 
+0

謝謝!我完全忽視了延期功能中的這個。更換'this'後,一切正常。 –