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(...);
道场版本: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(...);