Javascript数组和Meteor会话

Javascript数组和Meteor会话,javascript,meteor,Javascript,Meteor,我做了一个有趣的观察。尝试更新存储在Meteor会话存储中的阵列时,以下代码不会传播更改: var tags = Session.get("Tags"); tags.push("a"); Session.set("Tags", tags); 但是,如果我将第一行更改为使用Session.get(“Tags”).slice(),则取决于会话的所有内容都将相应地更新。我猜这是因为Meteor测试了一些引用的相等性,因此没有更新任何内容 有没有更好的方法来管理存储在meteor会话存储中的列表? 如

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

var tags = Session.get("Tags");
tags.push("a");
Session.set("Tags", tags);
但是,如果我将第一行更改为使用
Session.get(“Tags”).slice()
,则取决于会话的所有内容都将相应地更新。我猜这是因为Meteor测试了一些引用的相等性,因此没有更新任何内容

有没有更好的方法来管理存储在meteor会话存储中的列表?

如果我现在尝试从集合中删除一个元素(使用
array.remove()
from),那么行为会有点。。。属于我在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()的调用行为不同?简而言之:使用
var index=cardTags.indexOf(this.toString())取而代之

长版本:

在JavaScript中使用字符串时,这些是字符串,而
typeof'test'
返回
string

让我们看一下以下代码,以找到用JavaScript表示字符串的另一种方法:

var func = function () {
    return this;
};
console.log(func.call('test'));
控制台(至少FireBug)不会向我们显示
“test”
,而是显示
字符串{0=“t”,1=“e”,2=“s”,3=“t”}
typeof
将返回
“对象”

语句的内容似乎需要是一个对象。为了将字符串转换为“string”对象,我们可以执行
console.log(新字符串('test')),与先前记录的值相同


要将字符串对象转换为字符串(数据类型),只需使用其原型
toString

我相信这与。为了触发更改事件,Meteor需要有一个新的数组引用,而不仅仅是旧数组的更新副本


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

就我而言,我无法理解这与所问问题的关系。这对将数组存储为Meteor会话变量有什么帮助?再加上一个用于随机性的变量-他要么有很强的幽默感,要么几年后anwser在处理另一个问题,今天仍然是这样吗?有人知道吗?@JeremyIglehart我想是的,还是一样。对我来说
Session.set('q',Session.get('q')+1)用于增加q