Javascript数组和Meteor会话

Mar*_*mer 11 javascript meteor

我做了一个有趣的观察.尝试更新存储在Meteor会话存储中的阵列时,以下代码不会传播更改:

var tags = Session.get("Tags");
tags.push("a");
Session.set("Tags", tags);
Run Code Online (Sandbox Code Playgroud)

但是,如果我更改要使用的第一行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);
}
Run Code Online (Sandbox Code Playgroud)

这输出:

1
Removing tag "a", index: -1, typeof(this) = string
Run Code Online (Sandbox Code Playgroud)

所以不知何故,几乎在任何情况下,该cardTags.indexOf(this);声明似乎都会回归-1.我想我正在做一些根本错误的事情,因为我现在对javascript,但不知怎的,我无法弄清楚这里发生了什么.

为什么对indexOf()的这两个调用会有不同的行为?

Pet*_*rov 10

我相信这与Backbone.js中的这种情况相同.为了触发更改事件,Meteor需要为数组提供新的引用,而不仅仅是旧数据的更新副本.

简而言之,为了获得"正确"的行为,您需要克隆数组,进行所需的更改,然后执行Session.set('foo',myCopiedArray).