我試圖使用d3.dispatch
和Dispatching Events塊來指導我調整幾個視圖/控件。但是,我遇到了一個概念性障礙。請看下面的意見/控制:協調視圖/調度事件
- 國家
- 每天的事件數的直方圖的下拉
我想要滴事件列表向下過濾直方圖和列表。然後,我想刷直方圖以再次篩選列表。換句話說,應該可以回答一個問題,如「向我展示這些國家這些日子的事件」。
問題是,當我使用d3.dispatch
註冊過濾器事件時,直方圖會自行過濾。我知道爲什麼會這樣;直方圖是用過濾器事件註冊的,但不知道它是否自己觸發了這個事件。我無法弄清楚的是將下拉菜單與直方圖和列表以及直方圖鏈接到列表的合理模式。每個視圖是否應該有過濾器事件?我是否應該根據需要將每個視圖註冊到其他視圖?
以下代碼片段可能有助於澄清問題。爲簡單起見,我已經取代了直方圖按鈕:
var dispatch = d3.dispatch('load', 'filter');
dispatch.on('filter.histogram', function() {
console.log('filter.histogram');
});
dispatch.on('filter.list', function() {
console.log('filter.list');
});
dispatch.on('load', function() {
console.log('load');
d3.select('select').on('change', function() {
dispatch.filter();
});
d3.select('button').on('click', function() {
dispatch.filter();
});
});
dispatch.load();
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<html>
<body>
<select>
<option>Option 1</option>
<option>Option 2</option>
<option>Option 3</option>
</select>
<button>Histogram</button>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
</body>
每個視圖都可以訪問原始事件數組,每個事件數組然後都會過濾並作爲參數傳遞給dispatch.filter()。我沒有將這種行爲包含在我的代碼片段中,因爲我對那些不緊密結合視圖的方法感興趣。從你的回答看來,我應該調查一個類似MVC的體系結構:d3.dispatch似乎更適合定製事件,正如你所討論的那樣。 – 2014-10-30 21:20:36