0

だから私は流星のサイトでリーダーボードの例をやっていますが、最初に定義済みのデータの代わりに、誰かがアカウントを作成したときに画面に自動的に表示される新しい名前とスコアを作成したいので、この時点で名前を取得しますアカウントを作成してブラウザの更新ボタンを押した後にのみ画面にスコアが表示されるのですが、更新ボタンを押す必要がなく、ユーザーのログイン名とスコアが自動的にブラウザに表示されるようにするにはどうすればよいですか?画面?

どうにかして deps.flush() や meteor.render を使いたいですか?

サーバー.js

// newUser Method

 Meteor.methods({
  newUser: function() {
   var user = Meteor.user();

    userVar = {
     name: user.username,
    score: 0
     };

   Players.insert(userVar);
     }
   });

client.js

Deps.autorun(function() {
  Meteor.call('newUser');
  });

 Template.leaderboard.players = function () {
   return Players.find({}, {sort: {score: -1, name: 1}});
  };

  Template.leaderboard.selected_name = function () {
    var player = Players.findOne(Session.get("selected_player"));
     return player && player.name;
   };

   Template.player.selected = function () {
      return Session.equals("selected_player", this._id) ? "selected" : '';
     };

  Template.leaderboard.events({
     'click input.inc': function () {
     Players.update(Session.get("selected_player"), {$inc: {score: 5}});
   }
 });

Template.player.events({
 'click': function () {
  Session.set("selected_player", this._id);
 }
 });
4

2 に答える 2

1

開始点がサンプルの作業バージョンである場合、Players コレクションが変更されるたびに、Web ページへの反応的な変更が見られるはずです。Deps.flush や Meteor.render は不要です。

あなたが持っている Deps.autorun() 関数は、クライアントの起動時に一度だけ呼び出されます。その時点でユーザーがいない可能性があり、null 変数「user」からユーザー名を取得しようとすると、メソッドは失敗します。

ログインごとに自動実行をトリガーするには、ユーザーがいるときにリアクティブ データ ソースを参照する必要があります。このように書き換えると、ユーザーがログインするたびに新しいプレーヤーが表示されるはずです。

//on client
Deps.autorun( function(){
  if ( Meteor.userId() ){
    Meteor.call('newUser');
  }
});

this.userId は通常、メソッド内でユーザー情報を取得する方法であるため、サーバー上のメソッドに問題があるかどうかも疑問です。メソッドを回避し、クライアントにプレーヤーを挿入するだけの代替手段を次に示します。

//on client
Deps.autorun( function(){
  var user = Meteor.user();

  if ( user ) {   //insert will run on login or any change in the user
    var userVar = {
      name: user.username,
      score: 0
    };

    Players.insert(userVar);
  }
});
于 2013-07-29T00:56:02.827 に答える