2012-12-08 6 views
6

Ich habe ein Problem beim Laufen mit Meteor.Meteor Vorlage Reload Unendlichkeit

Ich habe eine "Frage" -Seite, die ich die Zählansicht vergrößern möchte, wenn es gerendert wird.

Also in meinem Template-Funktion schreibe ich

Template.questionview.helpers({ 
    question : function() { 
     if(Session.equals('main_template_name', 'question')) { 
     console.log(Session.get('question_id')); 
     Questions.update({ 
      _id: Session.get('question_id') 
     }, { 
      $inc: { 
      views: 1 
     } 
    }); 
    } 
}); 

hier nun das Problem kommt, wenn ich die Frage Ansicht und aktualisieren Sie die Frage Artikel machen, wird die Ansicht wieder aufgefrischt, weil es eine reflektierende Seite. Und dann kommt die Unendlichkeitsschleife.

Jeder hat Vorschläge?

Antwort

4

In Situationen wie diesen ist das Modell normalerweise defekt. In diesem Fall glaube ich, dass es sich um die Idee "Grafansicht" handelt. Es gibt viele Möglichkeiten, dies richtig zu machen. Beim Rendern wird es nicht erhöht, da Sie Modellarbeit im UI-Code ausführen (konzeptionell und in der Implementierung unterbrochen).

Speichern Sie zuerst die Fragen, die der Benutzer irgendwo besucht hat. Warum nicht eine {questionsVisited:[]} Eigenschaft auf dem Benutzer?

Verwenden Sie einen Meteor.call(...) Methodenaufruf eine Ansicht registrieren statt:

Meteor.methods({ 
    viewQuestion: function(questionId) { 
    // check if the user hasn't visited this question already 
    var user = Meteor.users.findOne({_id:this.userId,questionsVisited:{$ne:questionId}}); 

    if (!user) 
     return false; 

    // otherwise, increment the question view count and add the question to the user's visited page 
    Meteor.users.update({_id:this.userId},{$addToSet:{questionsVisited:questionId}}); 
    Questions.update({_id:questionId},{$inc:{views:1}}); 
    return true; 
}); 

So wie etwa die Sicht auf Änderungen an der Benutzeroberfläche erhöht wird? Nun, machen wir das nicht speziell. Lassen Sie uns die Anzahl der Aufrufe erhöhen nur, wenn sich die Frage ändert.

Meteor.autorun(function() { 
    var questionId = Session.get("question_id"); 
    Meteor.call('viewQuestion',questionId,function(e,r) { 
    if (r) 
     console.log("Question " + questionId + " logged an increment."); 
    else 
     console.log("Question " + questionId + " has already been visited by user " + Meteor.userId(); 
    }); 
}); 

Und diese Frage Helfer Sachen aller ...

Dies ist sogar noch besser als das, was man wollte loswerden ursprünglich. Jetzt werden Ansichten für denselben Benutzer nicht doppelt gezählt. Wenn dies das gewünschte Verhalten ist, entfernen Sie die questionsVisited Logik.

Nur Ändern Sie die 'question_id' Sitzungsvariable, wenn Sie tatsächlich die logische Frage ändern, mit der der Benutzer arbeitet.

+0

Sie sind brillant. Ich hätte die user_id in Frage oder question_id im Benutzer wie von Ihnen vorgeschlagen registriert. Ich denke, deine Lösung ist sauberer. Ich lerne immer noch Meteor. Kann ich fragen, warum ich Helfermaterial loswerden soll? – user857188

0

Anstatt in einen Helfer, würde ich diese Logik in das gerenderte Ereignis setzen, dh.

Template.questionview.rendered ... 

Siehe the Meteor docs.

+0

Danke für die Hilfe. Ich habe es tatsächlich schon einmal ausprobiert. Es ist jedoch das Gleiche. Ich denke es ist, weil, nachdem ich die Frage aktualisiert habe, die Frageansichtsvorlage erneut gerendert wird. Sobald es neu gerendert wird, wird die Frage aktualisiert, und so weiter und weiter ... – user857188

+1

Ich bin nicht sicher, ob es eine Möglichkeit gibt, Meteor zu sagen, die Seite nicht zu aktualisieren. Ich meine, bitten Sie Meteor vielleicht, die Sicht nicht zu erneuern. – user857188

1

löste ich dieses Problem durch meteor-collection-hooks

mit Zuerst installieren

>_ meteor add matb33:collection-hooks 

Dann in Ihrem Modell

Questions.after.findOne(function (userId, selector, options, doc){ 
    Questions.update({_id: doc._id},{$inc:{views:1}}); 
}); 

Und KABOOM Das ist es

0

Wenn Sie mit veröffentlichen und sub Schreiber (Sie sollten auf jeden Fall sowieso) Sie können es auf Ihre veröffentlichen Methode wie

Meteor.publish('posts', function(id) { 
    Posts.update({_id:id},{$inc:{view:1}}); 
    return Posts.find({_id: id}); 
}); 

oder Ihren Rückruf abonnieren

Meteor.subscribe("posts" , id { 
    onReady: function() { Meteor.call("incrementView", id);}}); 

diese Weise können Sie nur die Zählung erhöht einmal jedes Mal Benutzer den Browser öffnen.