2013-07-12 61 views
1

在我App.NodesIndexController我做這樣的事情:聽存儲事件

destroyAllRecords: function() { 
    var _this=this; 
    Bootstrap.ModalPane.popup({ 
     heading: 'Warning', 
     message: 'Are you sure you want to delete all nodes?', 
     primary: 'Ok', 
     secondary: 'Cancel', 
     showBackdrop: true, 
     callback: function(opts, event) { 
      if (opts.primary) { 
       _this.forEach(function(node) { 
        console.log('Deleting node %o', node); 
        node.deleteRecord(); 
       }); 
       var store = _this.get('store').commit(); 
       store.commit(); 
       store.on('didDelete', toggleMessageTray.bind(this, 'All nodes have been successfully deleted')); 
      } 
     } 
    }); 
} 

但我居然不知道如何傾聽「商店已經更新」事件。我不想聆聽單個的事件,而是在執行提交後觸發的全局商店事件。

三個問題:

  1. 有沒有這樣的情況?
  2. 商店事件定義在哪裏?我沒有看到關於它的文檔(this是我所知道的關於該商店的唯一文檔)
  3. 是否有更好的方法來刪除所有記錄,而不是在循環中刪除它們中的每一個?

回答

1

首先是好問題!讓我試着給你一個opinion持的答案。

有沒有這樣的事件?

據我所知,在商店裏聽不到有這樣的事件。

定義的商店事件在哪裏?我沒有看到關於它的文檔(這是我所知道的關於商店的唯一文檔)

由於ember-data尚未準備好生產,唯一真實的事實是源代碼和內聯註釋。但通常,當持續更改後端並根據您的設置所涉及的類別,StoreRESTAdapterJSONSerializer有一個外觀時,您可以擴展所有這些類以使其工作。

是否有更好的方法來刪除所有記錄,而不是在循環中刪除它們中的每一個?

是的,沒有,你的適配器上定義bulkCommittrue只有一個通話將被提出到後臺與所有記錄的哈希值,但只創建記錄(感謝@MilkyWayJoe的情況下,糾正我,見下面的評論),但這顯然涉及你的後端可以處理,如果這樣做,當然可以提高性能。

恕我直言,你在哪裏的通過擴展默認RESTAdapter,寫你自己的適配器和鉤到方法didDeleteRecords因爲這種方法是通過適配器調用時被刪掉了所有的記錄要好。

所以,我希望我的回答可以幫助你做出正確的選擇 - 這意味着使用燼數據和編寫自己的適配器或普通的老ajax電話去處理所有服務器上的東西又名:

App.IndexRoute = Ember.Route.extend({ 
    model: function() { 
    return $.getJSON(...); 
    } 
}); 

如果您決定放棄餘燼數據,作爲一個起點,請查看discourse.orgrepo here的應用程序版本。它的構建沒有餘燼數據,並且可以作爲了解如何完成工作的好地方。另外值得一提的是這blog post詳細介紹了discourse.org如何驅動它的網站沒有燼數據。

+0

我喜歡你的答案,但我真的不知道你可以用'DELETE'批量提交。大多數情況下,我看到有人在做'POST'傳遞所有ID作爲請求數據。另一種常見的方法是將「節點」作爲資源,因此您可以刪除此節點並在服務器中刪除子記錄,但仍需要爲兒童同步商店 – MilkyWayJoe

+0

@MilkyWayJoe,謝謝!嗯,現在你讓我懷疑......我會更深入地觀察,並更正我的回答:) – intuitivepixel

+0

我可能完全錯誤的THO :)如果在API中有一個'didDeleteRecords',它應該可能在批量刪除時觸發是完整的...所以我可能錯了 – MilkyWayJoe