2015-05-07 54 views
0

我將一段代碼從會話遷移到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)) 

回答

0

keys簡直是ReactiveDict的財產,不登記的活性依賴關係,這是正常現象。在current implementation(meteor v1.1)中,沒有一種簡單的方法可以實現你正在尋找的東西。

upcoming versionall將設立一個所有鍵的反應性依賴,所以這將工作:

Tracker.autorun(function() { 
    _.each(selected.all(), function(value, key) { 
    console.log(key + ":" + value); 
    }); 
}); 

如果你想現在使用的版本,您可以將源下載到文件稱爲lib/reactive-dict2.js並用ReactiveDict2(當前第19和43行 - 請注意這是至關重要的,或者您的應用的其他部分可能會中斷)替換對ReactiveDict的任何引用。那麼你可以這樣做使用它:

var selected2 = new ReactiveDict2() 

而上面的代碼應該工作。

相關問題