我将一段代码从Session迁移到ReactiveDict.经过一些调试后,当{key:value}对添加到字典中时,ReactiveDict不会触发任何重新计算事件.
var selected = new ReactiveDict()
Meteor.autorun(function() {
for (var k in selected.keys)
console.log("reactiveDict", k, " : ", selected.get(k))
})
Meteor.setTimeout(function () { selected.set('test', true) }, 1000)
Meteor.setTimeout(function () { selected.set('test', false) }, 2000)
Meteor.setTimeout(function () { selected.set('test', true) }, 3000)
Meteor.setTimeout(function () { selected.set('test', false) }, 4000)
Run Code Online (Sandbox Code Playgroud)
该代码不会打印任何内容,而以下工作
Meteor.autorun(function() {
for (var k in Session.keys)
console.log("session", k, Session.get(k))
})
Session.set('test', true)
Run Code Online (Sandbox Code Playgroud)
它打印"会话测试为真"(会话在客户端更新中保存,因此需要确保从一个新环境开始,以使测试有效)
我的理解是ReactiveDict是Session的替代品(实际上是Session的代码可用于包中).但在这种情况下,他们表现得非常不同.
我发现的唯一解决方法是使用已经存在的人工变量强制反应触发器
var selected2 = new ReactiveDict()
selected2.set('workaround', false)
Meteor.autorun(function() {
for (var k in selected2.keys)
{
var v = selected2.get(k)
if (k != "workaround") console.log("selected2", k, " : ", v)
}
})
var selected2_set = function (key, value) {
var w = (selected2.keys[key] == undefined)
selected2.set(key, value)
if (w) {
selected2.set('workaround', true)
selected2.set('workaround', false)
}
}
Meteor.setTimeout(function () { selected2_set('test', true) }, 1000)
Meteor.setTimeout(function () { selected2_set('test', false) }, 2000)
Meteor.setTimeout(function () { selected2_set('test', true) }, 3000)
Run Code Online (Sandbox Code Playgroud)
打印"selected2 test:true",然后为false,然后为true
我的问题是
我想到的解决方法的唯一"改进"是允许"变通办法"在真与假之间交替,但这会产生其他类型的问题,例如无法迭代只是寻找真值.
此外,必须注意不要过滤"解决方法",因为重新计算没有被正确触发.例如,自动运行中的以下更改不起作用,因为get('workaround')永远不会运行.
if (k != "workaround") console.log("selected2", k, " : ", selected2.get(k))
Run Code Online (Sandbox Code Playgroud)
keys只是 的一个属性ReactiveDict,并且不注册反应性依赖项,因此这种行为是预期的。在当前的实现(meteor v1.1)中,没有一种简单的方法可以实现您正在寻找的目标。
在即将推出的版本中,all将设置对所有键的反应性依赖,因此这将起作用:
Tracker.autorun(function() {
_.each(selected.all(), function(value, key) {
console.log(key + ":" + value);
});
});
Run Code Online (Sandbox Code Playgroud)
如果您现在想使用该版本,您可以将源代码下载到名为 的文件中lib/reactive-dict2.js,并将对的任何引用替换为ReactiveDict(ReactiveDict2当前为第 19 行和第 43 行 - 请注意,这很关键,否则应用程序的其他部分可能会损坏)。然后你可以这样做来使用它:
var selected2 = new ReactiveDict2()
Run Code Online (Sandbox Code Playgroud)
上面的代码应该可以工作。
| 归档时间: |
|
| 查看次数: |
353 次 |
| 最近记录: |