1

トラッカーに関するチュートリアルに従っていますが、予期しない動作が見られます。

ここでは、getter と setter を使用して、setterTracker.autorun()を呼び出すたびに呼び出されることを確認しています。

if (Meteor.isClient) {
  var favoriteFood = 'Apples';
  var favoriteFoodDep = new Tracker.Dependency;

  var getFavoriteFood = function () {
    favoriteFoodDep.depend();
    return favoriteFood;
  };

  var setFavoriteFood = function (newValue) {
    favoriteFood = newValue;
    favoriteFoodDep.changed();
  };

  var handle = Tracker.autorun (function () {
    console.log("your favorite food is " + getFavoriteFood());
  });

  setFavoriteFood("Mangos");
  setFavoriteFood("Bananas");
  setFavoriteFood("Cheese");
}

ブラウザ コンソールを開くと、

Your favorite food is Apples
Your favorite food is Mangos
Your favorite food is Bananas
Your favorite food is Cheese

しかし、何回呼び出しても、最初と最後のものだけが表示されsetFavoriteFood()ます。

Your favorite food is Apples
Your favorite food is Cheese

なぜこうなった?

4

1 に答える 1

1

ここに競合状態があると思います。行を実行するため

setFavoriteFood("Mangos");
setFavoriteFood("Bananas");
setFavoriteFood("Cheese");

.. ゲッターが無効化された計算を再実行するまでに、設定値は「チーズ」になります。

これをテストするには、次の実行を検討してください。

setFavoriteFood("Mangos");
window.setTimeout(function() { 
  setFavoriteFood("Bananas");
}, 1000);
window.setTimeout(function() { 
  setFavoriteFood("Cheese");
}, 2000);

4つすべてがコンソールに記録されると思われます。報告して、私に知らせてください!

于 2015-07-16T09:08:59.797 に答える