2015-06-06 57 views
1

道場版本:1.10.0dstore(道場)事件(添加)啞火上收集

dstore版本:1.1.0

的步驟,隨訪。

1)使用dstore內存創建存儲器(employeeStore)。

2)創建的集合salesEmployee通過應用 filter .I,電子employeeStore.filter({department:'sales'});

3)添加了add事件偵聽器上salesEmployee集合。

4)增加了一個新員工到employeeStore與部門 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'}); 

}); 

我的理解是否正確?

回答

1

集合通常從源自它們的商店繼承add/put/remove方法。當dstore觸發事件時,通知與商店相關的所有集合。這主要是爲了一致性,因爲在商店是基於服務器的情況下,根據其範圍/過濾器/分類標準,不可能純粹確定客戶端是否適用於每個集合。無可否認,對於可以過濾事件的簡單情況,最一致並不總是證明最方便。

如果您,讓您在內存存儲可跟蹤(使用dstore/Trackable),聽一次跟蹤收集,你應該能夠通過檢查event.indexevent.previousIndex您的過濾器配套項目事件進行區分(兩者都是undefined爲被過濾掉的項目)。

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

感謝您的解釋! – frank