1

我有以下代码来实现 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但事实并非如此。相反,如果我将对象放入observernotinventoryStore然后它会听。

如果我更改如下代码

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

然后它工作。令人沮丧的是,即使我遵循了文档中的确切代码,它也不起作用。

我必须使用第一个代码块(将对象放入inventoryStorenot in observer)的原因是我的某些对象不能存储在 Observable Memory 中,而只能存储在 Memory 中。任何建议将被认真考虑 :)

4

2 回答 2

7

经过数小时的测试,事实证明,要观察 中的变化Memory Store,您必须add / remove / update通过 Observable 对象而不是通过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了它引用了内存中的一些对象,这些对象由于属性名称不匹配而调用了一些奇怪的方法。

我希望你们中的任何人都不会因为这件事而受苦。:)

于 2013-08-12T06:31:00.517 回答
2

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

因此,如果你们中的任何人仍然坚持这个问题,请确保设置 includeObjectUpdates参数。

resultSet.observe(listener, includeObjectUpdates);

再见。

于 2015-10-30T09:37:18.283 回答