2

私は、なぜこのコードが時々機能するのか、すべてではなく (または少なくともほとんどの場合) 機能するのかについて頭を悩ませてきました。実際にブラウザで正しいコンテンツを表示することが時々あることがわかりましたが、奇妙なことに、同じコードに戻ってサーバーを実行し(通常どおり)、ページはコンソールでエラーを受け取ります:TypeError: 'undefined' is not an object (evaluating 'Session.get('x').html')

(そのエラーを受け取ると、コンソールの次の行がオブジェクトErrorを参照する場合と、オブジェクトを参照する場合があります!?)。errObjectdata

Meteor のセッション変数について明らかに何かが欠けていて、それらを誤用しているに違いありませんか? 経験のある人が私を正しい方向に向けてくれることを願っています。

事前に助けてくれてありがとう!

ここに私のダミーコードがあります:

/client/del.html
<head>
  <title>del</title>
</head>

<body>
  {{> hello}}
</body>

<template name="hello">
  Hello World!
  <div class="helloButton">{{{greeting}}}</div>
</template>

私のクライアント側のJavaScriptファイルは次のとおりです。

/client/del.js
Meteor.call('foo', 300, function(err, data) {
  err ? console.log(err) : console.log(data);
  Session.set('x', data);
});

Template.hello.events = {
  'click div.helloButton' : function(evt) {
    if ( Session.get('x').answer.toString() === evt.target.innerHTML ) {
      console.log('yay!');
    }
  } 
};

Template.hello.greeting = function() {
  return Session.get('x').html;
};

そして、私のサーバー側のJavaScriptは次のとおりです。

/server/svr.js
Meteor.methods({

  doubled: function(num) {
    return num * 2;
  },

  foo: function(lmt) {
    var count = lmt,
        result = {};

    for ( var i = 0; i < lmt; i++ ) {
        count++;
    }

    count = Meteor.call('doubled', count);

    result.html = "<em>" + count + "</em>";
    result.answer = count;
    return result;

  }

});
4

2 に答える 2

1

クライアントが最初に起動したときに、セッション変数がまだ設定されていないだけだと思います。したがって、メソッド呼び出し ( )Session.get('x')が戻るまで戻りますが、これはテンプレートが最初に描画される前にはほぼ確実に発生しません。undefinedfoo

ただし、その後はセッションになるため、更新すると正しく動作する可能性があります。

答えはundefined、変数にアクセスしようとする前かどうかを確認することです。例えば:

Template.hello.greeting = function() {
  if (Session.get('x')) return Session.get('x').html;
};
于 2012-06-02T03:34:00.030 に答える
1

Meteorの7 つの原則の1 つは次のとおりです。

遅延補償。クライアントで、プリフェッチとモデル シミュレーションを使用して、データベースへのゼロ レイテンシー接続があるように見せます。

待ち時間があるため、クライアントは、クライアントが接続した時点で持っているデータに従って、最初にレイアウトを描画しようとします。次に、呼び出しを実行し、呼び出しに従って更新します。場合によっては、呼び出しが同時に引き出されるのに十分な速さで応答できる場合があります。

変数が設定されない可能性があるため、その場合は例外がスローされ、実行が中断されます (コール スタック内の関数が実行を継続しないため)。

これには、次の 2 つの解決策があります。

  1. 変数が設定されていることを確認して使用してください。

    return Session.get('x') ? Session.get('x').html : '';

  2. 変数をスクリプトの先頭に設定して、変数に初期値があることを確認します。

    Session.set('x', { html = '', answer = ''});

もう 1 つの方法は、呼び出しが応答したときにテンプレートを追加することです。

Meteor.call('foo', 300, function(err, data) {
    Session.set('x', data);
    $('#page').html(Meteor.ui.render(function() {
        return Template.someName();
    }));
});
于 2012-06-02T23:03:34.000 に答える