道场版本:1.10.0
数据存储版本:1.1.0
遵循的步骤。
1) 使用 dstore 内存创建内存存储 ( employeeStore
)。
2) 通过应用创建了一个集合 salesEmployee
filter
.i,e employeeStore.filter({department:'sales'});
3) 在 salesEmployee
集合上添加了 add
事件监听器。
4) 在 employeeStore
中添加了一名新员工以及部门
会计即employeeStore.add({name:'William', Department:'accounting'});
add
事件监听器即使附加到
salesEmployee
集合。
根据我的理解,事件监听器不应触发,因为该员工属于会计部门,并且监听器附加到salesEmpyoee
集合。
这是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'});
});
我的理解正确吗?
最佳答案
集合通常从它们起源的存储中继承添加/放置/删除方法。当 dstore 触发事件时,与该商店相关的所有集合都会收到通知。这主要是为了一致性,因为在存储基于服务器的情况下,不可能纯粹在客户端根据其范围/过滤器/排序标准确定每个事件是否适用于每个集合。诚然,对于可以能够过滤事件的简单情况来说,最一致的东西并不总是被证明是最方便的。
如果您要使内存存储可跟踪(使用 dstore/Trackable
)并监听跟踪的集合,您应该能够通过检查 event.index
来区分与您的过滤器匹配的项目的事件。和event.previousIndex
(对于被过滤掉的项目,两者都是 undefined
)。
var TrackableMemory = declare([ Memory, Trackable ]);
var store = new TrackableMemory({ data: ... });
var collection = store.filter(...).track();
collection.on(...);
关于javascript - dstore ( dojo ) 事件(添加)在集合上失火,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30686498/