我正在为围绕有状态对象和可观察存储的 MVC 模式而苦苦挣扎。我无法明确何时使用一个而不是另一个,并且混合它们并不像我希望的那样干净。随便啊!深入了解如何管理可观察的有状态项集合?
如果我做一个 item.set("key", value) 我可以 item.watch("key", cb) 但是我的观察者没有被通知。
我可以做一个 item.watch(function() { state.notify(item, item.id); }) 来总是通知我的观察者但是如果我的观察者调用集我得到一个“查询已过期,你必须在任何数据修改之前观察()查询”错误我无法协调。
我可以通过 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;
}
而且我有一个存储包装器(用于图层),我将其分解成碎片,试图让观察者通知数据更改而不会出错:
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;
},