2015-09-21 75 views
0

我想讓div淡出,然後更改正在模板中使用的會話變量。會話變量在回調函數中成功更改,但模板未被動更新。在JQuery回調中未更新的流星模板

以下不會被動地更新模板。 (這些都是觸發)

$(event.target.parentNode).find(subclass) 
          .fadeOut("slow", function() { 
    Session.set(this.valueOf() + "_show_exercise_fields", set_show_exercise_fields); 

以下被動更新模板。

Session.set(this.valueOf() + "_show_exercise_fields", set_show_exercise_fields); 
$(event.target.parentNode).find(subclass) 
          .fadeOut("slow", function() { 
    // do nothing 
}); 

有沒有辦法強制模板重新渲染或更好的方式來做我想做的事情。由於


編輯1

下面是整個函數

Template.exercise.events({ 
'click .exercise-name': function(event) { 
    var subclass     = ".exercise-fields-container"; 
    var set_show_exercise_fields = false; 

    if (!Session.get(this.valueOf() + "_show_exercise_fields")) { 
     var subclass     = ".exercise-options-container"; 
     var set_show_exercise_fields = true; 
    } 

    // find the subclass (either the fields container or the options 
    // container) and fade out 
    $(event.target.parentNode).find(subclass) 
           .fadeOut("slow", function() { 
     Session.set(this.valueOf() + "_show_exercise_fields", set_show_exercise_fields); 
    }); 
} 
}); 

Template.exercise.helpers({ 
    show_fields: function() { 
     Session.setDefault(this.valueOf() + "_show_exercise_fields", true); 
     return Session.get(this.valueOf() + "_show_exercise_fields"); 
    } 
}); 

下面是模板

<template name="exercise"> 
    <div class="exercise-name"> 
     {{this.name}} 
    </div> 

    {{#if show_fields}} 
     Fields 
    {{else}} 
     Options 
    {{/if}} 
</template> 
+0

我不明白爲什麼你的第二段代碼會被動更新。目前還不清楚什麼是被動數據源觸發的。你能擴展/解釋嗎?或者是你在展示觸發器(而不是反應)? –

+0

反應性數據源是會話變量'this.valueOf()+「_show_exercise_fields」'。我所展示的是觸發器,抱歉不夠清晰。 – mikeecb

+0

這是一個非常奇怪的模式。你想讓你的模板做出反應?顯然你明確地處理了點擊事件。你是否試圖對Session變量的其他地方的變化做出反應?如果是的話,爲什麼你不只是點擊事件更新Session變量,並有一個'tracker.autorun()'基於Session變量來執行淡出? –

回答

1

事件處理程序是沒有反應的上下文。您可以使用Tracker.autorun()創建一個反應性上下文。

如果您在傳遞給自動運行的函數中使用會話變量,則每當會話變量發生更改時,整個函數都會重新運行。在這種情況下,你可以按照你的願望淡入或淡出。

0

我曾在那裏集合了更新的場景,所以我不得不重新建立我使用Materialize Select

這裏就是我的渲染功能看起來像選擇元素。自動運行知道通道是一個被動數據源,並在該數據源發生變化時重新運行自動運行功能。

Channels = new Mongo.Collection("channels"); 

Template.channelSelectController.onRendered(function(){ 
    var self = this; 

    this.autorun(function(){ 
     var count = Channels.find().count(); 
     self.$('select').material_select(); 
    }); 
});