我正在圍繞有狀態對象和Observable商店的MVC模式掙扎。我無法找到什麼時候使用它們,並且混合它們並不像我希望的那麼幹淨。任何啊!瞭解如何管理可觀察的有狀態項目集合?dojo模式 - 何時使用set/watch以及何時使用notify/observe?
如果我做一個item.set(「key」,value),我可以item.watch(「key」,cb),但是然後我的觀察器沒有通知。
我可以做一個item.watch(函數(){state.notify(item,item.id);})總是通知我的觀察者,但如果我觀察呃調用set我得到一個「日期,您必須先觀察()任何數據修改之前的查詢「」我無法調和的錯誤。
我可以通過setTimeout解耦,但它感覺不好。
下面是一些代碼,以顯示我想要:
crudify: function (store, query, crud)
{
var result;
if (!crud)
{
crud = query;
query = store;
store = null;
}
if (store)
{
query = store.query(query);
}
result = query.observe(function (row, deleteIndex, insertIndex)
{
var del = (0 <= deleteIndex), ins = (0 <= insertIndex);
!del && ins && crud.c && crud.c(row);
del && ins && crud.u && crud.u(row);
del && !ins && crud.d && crud.d(row);
}, !!crud.u);
crud.c && array.forEach(query, crud.c);
return result;
}
而且我有一個商店包裝(圖層),這我黑客成碎片試圖得到通知的數據變化的觀察-ERS沒有得到錯誤:
addLayer: function (item) {
var that = this;
that.store.add(item);
item.watch && item.watch(function (name, prior, curr) {
if (prior !== curr) {
that._queue.push(item);
// attempting to eliminate queries which indirectly update the store (can't find source of error)
infor.delay(20, "LayerProcessorStoreNotification", function() {
that._queue.forEach(function (item) {
that.store.notify(item, that.getLayerId(item));
});
that._queue = [];
});
}
});
return item;
},
延遲的方法是這樣的:
delay: function (timeout, id, callback)
{
this.delays = this.delays || [];
var delay = this.delays[id];
if (delay)
{
clearTimeout(delay);
}
delay = setTimeout(callback, timeout);
this.delays[id] = delay;
},