簡體   English   中英

強制流星刷新/重新渲染模板?

[英]Force Meteor To Refresh / Re-render Templates?

*作為參考,我使用的是鐵路由器。

我將這個全局登錄表單而不是登錄頁面嵌入到導航欄中(也稱為每個頁面)。 現在,我正在進行一次非常hacky的刷新,以在用戶登錄后重新加載頁面。

我只想重新加載到模板,也就是不刷新整個頁面。 基本上只希望模板呈現的功能在登錄時重新運行。

這是我當前的登錄代碼:

'submit #login': function(event, template){
    event.preventDefault();
    var handle = template.find('#usernameLogin').value;
    var secretKey = template.find('#passwordLogin').value;
    Meteor.loginWithPassword(handle, secretKey, function(err){
        if (err) {
            alert(err);
        }else{
            $('#close').click();
            /* replace this with reactive ajax or whatever when you can! */
            Meteor._reload.reload();
        }
    });
},

我認為現在的渲染功能可能是真正的問題:

Template.tournament.rendered = function () {
    thisCampaign = this.data;
    var self = this;

    if (this.data.tournament.live) {

        /* if theres a registered user */
        if (Meteor.userId()) {

            /* Select a winner box */
            var participants = $('.participant-id');
            var currentParticipant;
            var nextRound;
            var thisMatch;
            var nextMatch;
            var bracket;
            participants.map(function(index, value){
                if ($(value).text() === Meteor.userId()) {
                    if ($(value).parent().find('.participant-status').text() === 'undetermined') {
                        nextRound = $(value).parent().find('.participant-round').text();
                        thisMatch = $(value).parent().find('.participant-match').text();
                        bracket = $(value).parent().parent().parent().find('.participant');
                    };
                };
            });
            nextRound = parseInt(nextRound) + 1;
            nextMatch = Math.round(parseInt(thisMatch)/2) - 1;
            if (parseInt(thisMatch) % 2 != 0) {
                currentParticipant = 0;
            }else{
                currentParticipant = 1;
            }
            var winnerOptions = '';
            var winnerBox = $('<div class="select-winner">');
            if (bracket) {
                bracket.map(function(index, value) {
                    winnerOptions += '<span class="winner-option"> '+$(value).find('.participant-title').text()+' <div class="winner-info"> '+$(value).find('a').html()+' </div> </span>'
                });
                winnerBox.append(winnerOptions);
                $($($('.round'+nextRound).find('li')[nextMatch]).find('.participant')[currentParticipant]).removeClass('loser').addClass('undetermined');
                $($($('.round'+nextRound).find('li')[nextMatch]).find('.participant')[currentParticipant]).find('a').addClass('tooltip').html(winnerBox);
            };

        }else{

        }

    }else{
        /* Tournament Start Time */

        var tournamentStartTime = function(){
            var d = new Date();
            var n = d.getTime();
            var currentTime = TimeSync.serverTime(n);
            var startTime = self.data.card.startTime;
            var difference = startTime - currentTime;
            var hoursDifference = Math.floor(difference/1000/60/60);
            difference -= hoursDifference*1000*60*60
            var minutesDifference = Math.floor(difference/1000/60);
            difference -= minutesDifference*1000*60
            var secondsDifference = Math.floor(difference/1000);
            /* if ends (make tournament live server side?) */
            if (hoursDifference < 0 || minutesDifference < 0 || secondsDifference < 0) {
                Meteor.clearInterval(tStartTime);
                Session.set("tournamentStartTime", false);
            }else{
                if (hoursDifference   < 10) {hoursDifference   = "0"+hoursDifference;}
                if (minutesDifference < 10) {minutesDifference = "0"+minutesDifference;}
                if (secondsDifference < 10) {secondsDifference = "0"+secondsDifference;}
                var formattedTime = hoursDifference + ':' + minutesDifference + ':' + secondsDifference;
                Session.set("tournamentStartTime", formattedTime);
            }
        };
        Session.set("tournamentStartTime", '00:00:00');
        tournamentStartTime();
        var tStartTime = Meteor.setInterval(tournamentStartTime, 1000);

        /* Allow new user sign up */
        var alreadySignedUp = false;
        var usersSignedUp = $('.participant-id')
        usersSignedUp.map(function (index, user) {
            if ($(user).text().trim() === Meteor.userId()) {
                alreadySignedUp = true;
            }
        });

        if (this.data.card.host != Meteor.user().username && !(alreadySignedUp)) {
            var openSlots = [];
            var allSlots = $('.participant');
            allSlots.map(function (index, participant) {
                if ($(participant).find('.participant-title').text().trim() === '' && !($(participant).hasClass('loser'))) {
                    openSlots.push(participant);
                }
            });
            openSlots.map(function (openSlot, index) {
                $(openSlot).removeClass('winner').addClass('undetermined');
            });
        }

        /* if theres a registered user */
        if (Meteor.userId()) {

        }else{

        }

    }
};

從我可以看到的地方,您的渲染功能將無法按預期工作,因為在loggingIn狀態仍在發生時模板可能會渲染...

我的建議是在{{#if currentUser}} page here{{/if}}使用類似的內容,然后將要嘗試運行的代碼放在currentUser塊內的幫助器中的呈現器中。僅在有登錄用戶時顯示並被調用,否則它將不會顯示,並且您無需重新渲染頁面即可執行任何操作。

基本上,一旦用戶登錄,具有Meteor.userId()Meteor.user()函數的任何幫助程序(呈現的助手Meteor.user()都將自動重新運行,否則,您可以在Tracker.autorun函數中執行登錄操作如果它們是每個客戶對您的應用程序全局的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM