dstore ( dojo ) 事件 (add) 在 collection 上失败

dstore ( dojo ) event (add) misfiring on collection

道场版本:1.10.0

dstore 版本:1.1.0

遵循的步骤。

1) 使用 dstore 内存创建了内存存储 (employeeStore)。

2) 通过应用创建 collection salesEmployee filter.i,e employeeStore.filter({department:'sales'});

3) 在 salesEmployee collection.

上添加了 add 事件侦听器

4) 将新员工添加到 employeeStore with department 会计employeeStore.add({name:'William', department:'accounting'});

add 事件侦听器即使附加到 salesEmployee collection.

根据我的理解,事件监听器不应该触发,因为该员工属于 会计 部门并且监听器附属于 salesEmplyoee collection .

这里是 jsfiddle.

require({
    packages: [
        {
            name: 'dstore',
    location: '//cdn.rawgit.com/SitePen/dstore/v1.1.0'
        }
    ]
}, [
    'dojo/_base/declare',
    'dstore/Memory',
    'dojo/domReady!'
], function(declare, DMemory ) {
    var employees = [
                        { name:'Jim', department:'accounting'},
                        { name:'Bill', department:'engineering'},
                        { name:'Mike', department:'sales'},
                        { name:'John', department:'sales'}
                    ];

    var employeeStore = new DMemory(
        {data:employees, 
         idProperty: 'name'});

    var salesEmployees = 
        employeeStore.filter({department:'sales'});

    salesEmployees.on('add', 
                      function(event){
                            alert(JSON.stringify(event.target));

                        });

    employeeStore.add({name:'William', department:'accounting'});

});

我的理解正确吗?

集合通常从它们的来源商店继承 add/put/remove 方法。当 dstore 触发事件时,所有与商店相关的集合都会收到通知。这主要是为了保持一致性,因为在存储基于服务器的情况下,不可能纯粹在客户端确定每个事件是否适用于每个集合,具体取决于其 range/filter/sort 标准。不可否认,对于可以可行地过滤事件的简单情况,最一致的并不总是被证明是最方便的。

如果您要使您的内存存储可跟踪(使用 dstore/Trackable)并监听跟踪的集合,您应该能够通过检查 [=12= 来区分与您的过滤器匹配的项目的事件] 和 event.previousIndex(对于被过滤掉的项目,两者都是 undefined)。

var TrackableMemory = declare([ Memory, Trackable ]);
var store = new TrackableMemory({ data: ... });
var collection = store.filter(...).track();
collection.on(...);