Javascript数组和Meteor会话
我做了一个有趣的观察。尝试更新存储在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会话存储中的列表? 如
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)对于几乎任何情况,code>语句似乎都返回-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