6

Meteor で実行中に問題が発生しました。

レンダリングされるたびにカウントビューを増やしたい「質問」ページがあります。

だから私のテンプレート関数で私は書く

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

ここで問題が発生します。質問ビューをレンダリングして質問項目を更新すると、反射ページであるため、ビューが再度更新されます。そして、無限ループが始まります。

誰にも提案がありますか?

4

4 に答える 4

4

通常、このような状況では、モデルに何か問題があります。この場合、それは「カウントビュー」のアイデアだと思います。これを正しく行う方法はたくさんあります。UIコードでモデル作業を行っているため(概念的にも実装的にも壊れています)、レンダリング時にインクリメントすることはできません。

まず、ユーザーが訪れた質問をどこかに保存します。{questionsVisited:[]}ユーザーのプロパティではないのはなぜですか?

Meteor.call(...)代わりにメソッド呼び出しを使用してビューを登録します。

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

では、UI の変更に関するビューをインクリメントするのはどうでしょうか? まあ、具体的にはやめましょう。質問が変わったときだけ閲覧数を増やしましょう。

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

そして、この質問ヘルパーのものをすべて取り除きます...

これは、最初に望んでいたものよりも優れています。同じユーザーのビューが 2 回カウントされなくなりました。questionsVisitedそれが望ましい動作である場合は、ロジックを削除します。

'question_id'ユーザーが作業している論理的な質問を実際に変更する場合にのみ、セッション変数を変更してください。

于 2012-12-13T09:38:21.667 に答える
1

meteor-collect-hooksを使用してこの問題を解決しました

まずはインストール

>_ meteor add matb33:collection-hooks

次に、モデルで

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

そしてKABOOM _

于 2015-11-05T03:32:06.303 に答える
0

パブリッシュとサブスクライブを使用している場合(とにかく絶対にすべきです)、次のようなパブリッシュメソッドで実行できます

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

またはサブスクライブコールバックで

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

この方法では、ユーザーがブラウザーを開くたびにカウントを 1 回だけインクリメントします。

于 2016-03-04T23:54:02.383 に答える
0

ヘルパーを入れるのではなく、このロジックをレンダリングされたイベントに入れます。

Template.questionview.rendered ...

Meteor のドキュメントを参照してください。

于 2012-12-09T04:37:47.730 に答える