我將一段代碼從會話遷移到ReactiveDict。經過一些調試後,當{key:value}對被添加到字典時,ReactiveDict不會觸發任何重新計算事件。Meteor 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)
代碼不顯示任何信息,而下面的作品
Meteor.autorun(function() {
for (var k in Session.keys)
console.log("session", k, Session.get(k))
})
Session.set('test', true)
它打印「會話測試真」(會話保存跨客戶端更新,因此人們需要確保先從新環境的測試是有效的)
我的理解是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)
打印人工變量的反應觸發「selected2測試:true」,那麼假的,那麼真正的
我的問題是
- 是ReactiveDict觀察到的功能或錯誤的行爲?
- 有沒有更好的解決方法?
這使我想起了解決辦法的唯一的「改進」是允許「處理方法」真假之間交替,但創建其他類型的如不能夠重複只是爲了尋找真正的價值問題。
此外,必須小心,不要過濾「解決方法」,因爲重新計算沒有正確觸發。例如,自動運行中的以下更改不起作用,因爲get('解決方法')永遠不會運行。
if (k != "workaround") console.log("selected2", k, " : ", selected2.get(k))