11

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

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

但是,如果我将第一行更改为 use Session.get("Tags").slice(),则取决于会话的所有内容都会相应更新。我猜这是因为 Meteor 测试了一些引用的相等性,因此没有更新任何东西。

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

如果我现在尝试从集合中删除一个元素(使用array.remove()from here),行为结果会有点......我在 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() 的调用会表现不同?

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似乎需要一个对象。为了将字符串转换为“字符串”对象,我们可以这样做console.log(new String('test'));,这与之前记录的值相同。

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

于 2012-08-02T20:21:33.470 回答