1

道场版本:1.10.0

dstore 版本:1.1.0

遵循的步骤。

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

salesEmployee2)通过应用 filter.i,e创建一个集合employeeStore.filter({department:'sales'});

3)在集合上添加了add事件监听器。salesEmployee

employeeStore4)在部门 会计中添加了一个新员工,即employeeStore.add({name:'William', department:'accounting'});

add即使事件侦听器附加到 salesEmployee集合,它也会触发。

根据我的理解,事件侦听器不应触发,因为该员工属于会计部门并且侦听器附加到salesEmplyoee集合中。

这是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'});

});

我的理解正确吗?

4

1 回答 1

1

集合通常从它们起源的商店继承 add/put/remove 方法。当 dstore 触发事件时,所有与 store 相关的集合都会收到通知。这主要是为了保持一致性,因为在存储基于服务器的情况下,不可能根据其范围/过滤器/排序标准来确定纯客户端是否每个事件适用于每个集合。诚然,对于可以过滤事件的简单情况,最一致的方法并不总是最方便。

如果您要使您的内存存储可跟踪(使用)并侦听跟踪的集合,您应该能够通过检查和dstore/Trackable区分匹配过滤器的项目的事件(两者都适用于被过滤掉的项目)。event.indexevent.previousIndexundefined

var TrackableMemory = declare([ Memory, Trackable ]);
var store = new TrackableMemory({ data: ... });
var collection = store.filter(...).track();
collection.on(...);
于 2015-06-09T00:27:29.620 回答