2013-02-09 13 views
5

Używam Meteora i mam problem z ponownym renderowaniem moich treści, gdy tego nie chcę.Zawartość zawinięta w ponowne renderowanie currentUser po aktualizacji użytkownika

Mam moją główną treść owiniętą w currentUser, jeśli stwierdzenie, które moim zdaniem jest dość standardowe.

{{#if currentUser}} 
    {{> content}} 
{{/if}} 

Problem z tym, że mój szablon treści jest ponownie renderowany podczas aktualizacji mojego obiektu użytkownika. Czy jest jakiś sposób obejścia tego? Nie odwołuję się do użytkowników w dowolnym miejscu szablonu treści.

Dziękujemy!

Oto aplikacja próbka powtórzyć mój problem:

HTML

<head> 
    <title>Render Test</title> 
</head> 

<body> 
    {{loginButtons}} 

    {{> userUpdate}} 

    {{#if currentUser}} 
    {{> content}} 
    {{/if}} 
</body> 

<template name="userUpdate"> 
    <p> 
    <input id="updateUser" type="button" value="Update User Value" /> 
    User last update: <span id="lastUpdated">{{lastUpdated}}</span> 
    </p> 
</template> 

<template name="content"> 
    <p>Render count: <span id="renderCount"></span></p> 
</template> 

JavaScript

if (Meteor.isClient) { 
    Meteor.startup(function() { 
    Session.set("contentRenderedCount", 0); 
    }); 

    Template.content.rendered = function() { 
    var renderCount = Session.get("contentRenderedCount") + 1; 
    Session.set("contentRenderedCount", renderCount); 
    document.getElementById("renderCount").innerText = renderCount; 
    }; 

    Template.userUpdate.events = { 
    "click #updateUser": function() { 
     Meteor.users.update({_id: Meteor.userId()}, {$set: {lastActive: new Date()}}); 
    } 
    }; 

    Template.userUpdate.lastUpdated = function() { 
    return Meteor.user().lastActive; 
    }; 

} 

if (Meteor.isServer) { 
    Meteor.users.allow({ 
    'update': function() { 
     return true; 
    } 
    }); 
} 

Aktualizacja: Powinienem wyjaśnić tym przykładzie mało. Po utworzeniu użytkownika kliknięcie przycisku Aktualizuj wartość użytkownika powoduje zwiększenie liczby renderów. Dzieje się tak dlatego, że jest on zawinięty w {{#if currentUser}}. Jeśli ta opcja zostanie usunięta, zauważysz, że liczba renderów pozostaje na poziomie 1.

Musisz również dodać do projektu pakiety accounts-ui i accounts-password.

Odpowiedz

8

Meteor ponownie wyświetli dowolny szablon zawierający zmienne reaktywne, które zostały zmienione. W twoim przypadku {{currentUser}} to Meteor.user(), który jest obiektem zawierającym dane użytkownika. Kiedy aktualizujesz profil użytkowników, obiekt zmienia się i mówi meteorowi, aby ponownie obliczyć wszystko reaktywne z udziałem obiektu.

Mogliśmy zmieniać reaktywność trochę tak, że reaguje tylko na zmiany, czy użytkownik loguje IN/OUT i nic nie obrębie samego obiektu:

Meteor.autorun(function() { 
    Session.set("meteor_loggedin",!!Meteor.user()); 
}); 

Handlebars.registerHelper('session',function(input){ 
    return Session.get(input); 
}); 

HTML

{{#if session "meteor_loggedin"}} 
    {{> content}} 
{{/if}}  
+0

który pracował doskonale. Dziękuję Ci! – Irving

+1

@MurWade z nowym silnikiem Blaze'a zainicjowanym przez Meteor 0.8.3 kilka miesięcy temu. Możesz teraz po prostu użyć '{{#if currentUser}} ... {{/ if}}' bez elementów wewnątrz renderowania ponownie – Akshat

+0

Używanie {{pathFor route = 'dashboard'}} wewnątrz czeku powoduje, że renderuje się ponownie , jakiś pomysł, jak to wyłączyć? – digz6666

Powiązane problemy