(dojo)Observable无法观察Memory Store中的变化

时间:2013-08-12 02:28:41

标签: javascript memory dojo store observable

我有以下代码来实现Observable Memory Store

var inventory = [
    {name:"shoes", quantity:10, category:"sales"},
    {name:"clothes", quantity:5, category:"sales"},
    {name:"hats", quantity:2, category:"sales"},
    {name:"shirts", quantity:20, category:"sales"}
];

var inventoryStore = new Memory({data:inventory, idProperty: "name"});
var observer = new Observable(inventoryStore);

results = observer.query({});

results.observe(function(item, removedIndex, insertedIndex) {
    if(removedIndex > -1) {
        console.log("removed");
    }
    if(insertedIndex > -1) {
        console.log("added");
    }
    console.log("Listened");
}, true);
inventoryStore.put(someObject);

有趣的是,代码不会听取inventoryStore中所做的更改。我希望只要observe()发生某些事情,它就会调用inventoryStore方法,但事实并非如此。相反,如果我将对象放入observer而不是inventoryStore,那么它会监听。

如果我更改代码如下

var inventoryStore = new Observable(Memory({data:inventory, idProperty: "name"}));
results = inventoryStore.query({});
inventoryStore.put(someObject);

然后它的工作原理。这是令人沮丧的,即使我遵循文档中的确切代码,它也无法正常工作。

我必须使用第一个代码块(将对象放在inventoryStore而不是observer中)的原因是我的某些对象不能存储在Observable Memory中,而只能存储在Memory中。 任何建议将不胜感激:)

2 个答案:

答案 0 :(得分:7)

经过数小时的测试后发现,为了观察Memory Store中的变化,您必须通过Observable对象add / remove / update对象而不是Memory。 这意味着您拥有two options to implement this

var inventoryStore = new Memory({data:inventory, idProperty:"name"});
var observer = new Observable(inventoryStore);
results = observer.query({});
observer.put(someObject);

var inventoryStore = new Observable(new Memory({data:inventory, idProperty:"name"});
results = inventoryStore.query({});
inventoryStore.put(someObject);

这看似显而易见但是我对此链接下的教程感到困惑。

http://www.tulek.org/2011/04/14/dojo-memory-and-observable-classes/

此外,

observer.setData(another Inventory);

不会触发observe()方法,只是更改观察者中的数据存储。这导致mismatching之间的Observable and Memory Store数据存储,因为内存存储仍具有原始库存集。

我的某些对象无法存储在Observable中的原因是我使用了dojo/calendar/Calendar并且它引用了一些来自内存的对象,这些对象调用了一些奇怪的方法,因为属性名称不匹配。

我希望你们这些人都不会受此事影响。 :)

答案 1 :(得分:1)

虽然这篇文章是2年,但我真的从中受益,因为我遇到了同样的问题。但我的错是在调用observe方法(facepalm)时将overwrite标志设置为第二个参数。

因此,如果您仍然坚持这个问题,请务必设置 includeObjectUpdates 参数。

resultSet.observe(listener, includeObjectUpdates);

再见。