11

私は興味深い観察をしました。Meteorセッションストレージに保存されている配列を更新しようとすると、次のコードは変更を伝播しません。

var tags = Session.get("Tags");
tags.push("a");
Session.set("Tags", tags);

しかし、最初の行を使用するように変更するSession.get("Tags").slice()と、セッションに応じてすべてがそれに応じて更新されます。これは、Meteorがいくつかの参照の同等性をテストしているため、何も更新されていないためだと思います。

流星セッションストアに保存されているリストを管理するためのより良い方法はありますか?

コレクションから要素を削除しようとすると(ここarray.remove()から使用)、動作は少し...の... Meteorテンプレートイベント内でこれを行っているため、コードは次のようになります。

"click .taglist li" : function(e) {
  var tags = Session.get("Tags").slice();
  var index = cardTags.indexOf(this);

  Meteor._debug(Session.get("Tags").slice().indexOf("a"));
  Meteor._debug("Removing tag \"" + this + "\", index: " + index, ", typeof(this) = " + typeof(this).toString());

  tags.remove(index);
  Session.set("Tags", tags);
}

これは以下を出力します:

1
Removing tag "a", index: -1, typeof(this) = string

したがって、どういうわけか、cardTags.indexOf(this);ステートメントは-1ほとんどすべての場合に返されるようです。私は今javascriptにかなり慣れているので、根本的に間違ったことをしていると思いますが、どういうわけかここで何が起こっているのか理解できません。

indexOf()へのこれら2つの呼び出しが異なる動作をするのはなぜですか?

4

2 に答える 2

10

これはBackbone.jsのこの状況と同じだと思います。変更イベントがトリガーされるためには、Meteorは、古い配列の更新されたコピーだけでなく、配列の新しい参照を持っている必要があります。

簡単に言うと、「正しい」動作を実現するには、配列のクローンを作成し、必要な変更を加えてから、Session.set('foo'、myCopiedArray)を実行する必要があります。

于 2013-10-01T22:16:44.437 に答える
-3

つまり、var index = cardTags.indexOf(this.toString());代わりに使用してください。

ロングバージョン:

JavaScriptで文字列を使用する場合、それらは文字列ですが、をtypeof 'test'返しますstring

JavaScriptで文字列を表現する別の方法を見つけるために、次のコードを見てみましょう。

var func = function () {
    return this;
};
console.log(func.call('test'));

コンソール(少なくともFireBug)には表示されません"test"が、代わりに表示されますString {0="t", 1="e", 2="s", 3="t" }typeofを返し"object"ます。

ステートメントの内容はthisオブジェクトである必要があるようです。文字列を「String」オブジェクトに変換するためにconsole.log(new String('test'));、以前にログに記録された値と同じを実行できます。

文字列オブジェクトを文字列(データ型)に変換するには、そのプロトタイプを使用するだけtoStringです。

于 2012-08-02T20:21:33.470 に答える