2013-01-10 66 views
1

我有一個名爲App.BlockView的視圖類。它有一個名爲selected的房產,並點擊此視圖切換selected屬性。如何在Emberjs View類的所有實例上設置屬性

當我捕獲某些事件,如點擊容器的背景時,我想在所有視圖(或將它設置爲true)設置selected屬性爲false。有沒有什麼辦法可以收集視圖類的所有實例 - 不管它們在哪裏以及如何實例化 - 併爲它們設置屬性?

請注意,我的視圖是在像{{View App.BlockView}}這樣的句柄模板中創建的,因此我不保留對它們的引用。

回答

2

您可以將視圖註冊並取消自己在類上的註冊來完成此操作。例如

App.BlockView.reopenClass({ 
    blockViews: [], 
    deselectAll: function() { 
    this.blockViews.forEach(function(blockView) { 
     blockView.set('selected', false); 
    }); 
    } 
}); 

App.BlockView.reopen({ 
    init: function() { 
    this._super(); 
    App.BlockView.blockViews.pushObject(this); 
    }, 
    destroy: function() { 
    App.BlockView.blockViews.removeObject(this); 
    this._super(); 
    } 
}); 
+1

你能舉一個例子說明你將如何觸發deselectAll()函數嗎?我想從控制器你可以做App.BlockView.deselectAll(),但它似乎不好使用這種靜態的方式。 –

+0

出於某種原因,我期待着Ember能夠保留我所有觀點的參考並使其可用。但是這個解決方案很容易實現並且工作得很好。謝謝盧克! – Aras

+0

@ sly7_7,你是對的。使用這個類有點味道(因爲它是全局的)。除了我的頭頂,你可以在某種注入註冊表中註冊視圖實例,注入註冊表也會注入到控制器中,或者注入到需要觸發影響所有實例的操作的任何位置。 –

相關問題