2013-02-09 11 views
5

Sto usando Meteor e ho un problema in cui il mio contenuto è stato rifatto quando non lo desidero.Contenuto avvolto in currentUser re-rendering quando l'utente è aggiornato

Ho il mio contenuto principale avvolto in un currentUser se affermazione che ritengo sia abbastanza standard.

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

Il problema con questo è il mio modello di contenuto è stato rieseguito quando aggiorno il mio oggetto utente. C'è un modo per aggirare questo? Non faccio riferimento agli utenti da nessuna parte all'interno del modello di contenuto.

Grazie!

Ecco un'applicazione di esempio per riprodurre il mio problema:

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; 
    } 
    }); 
} 

Aggiornamento: Avrei dovuto spiegare questo esempio un piccolo. Dopo aver creato un utente, facendo clic sul pulsante Aggiorna valore utente, il conteggio del rendering aumenta. Questo perché è racchiuso in un {{#if currentUser}}. Se questo è se viene rimosso, si noterà che il conteggio delle rendering rimane a 1.

Inoltre, è necessario aggiungere i pacchetti accounts-ui e accounts-password al progetto.

risposta

8

Meteor esegue il rendering di qualsiasi modello contenente variabili reattive alterate. Nel tuo caso lo {{currentUser}} è Meteor.user() che è un oggetto contenente i dati dell'utente. Quando aggiorni il profilo degli utenti, l'oggetto cambia e dice alla meteora di ricalcolare tutto reattivo che coinvolge l'oggetto.

Potremmo modificare la reattività un po 'in modo che reagisce solo alle variazioni se l'utente accede in/out e non nulla all'interno dell'oggetto stesso:

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

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

il codice HTML

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

che ha funzionato perfettamente. Grazie! – Irving

+1

@MurWade con il nuovo motore Blaze introdotto con Meteor 0.8.3 alcuni mesi fa. Ora puoi semplicemente usare '{{#if currentUser}} ... {{/ if}}' senza le cose all'interno del re-rendering – Akshat

+0

Usando {{pathFor route = 'dashboard'}} all'interno del controllo lo rende re-render , qualche idea su come disabilitarlo? – digz6666

Problemi correlati