最近把 select 當作 fullcalendar 套件的 filter
整理了一點心得...
P.S 只記錄關鍵部分的 code
範例:
假設今天要做一個補習班的行事曆, 要show出學生在某段時間上了某堂課
做一個 filter, 裡面有課程可以選擇,
方法:
用 select 搭配 fullcalendar
選到 select 裡面的選項
會只 show 出 fullcalendar 裡面符合選項的 event
流程:
先假設, select 的 id 設為 selectId
1.初始化 fullcalendar
$('#calendarId').fullCalendar({
//fullcaledar大部分的參數省略
eventSources:[{
url: '/projectName/...', //此url會打到後端, 我用spring搭配restful, 撈完資料可以傳值回前端
type: 'post',
contentType : "application/json;charset=UTF-8", //撈資料本例我用json, 一定要設定編碼要不然又亂碼
dataType : "json", //這裡也要設定
data:{
title: "title", //title會直接show在行事曆上,本例我是拿來當學生的姓名
start: "start",
end: "end",
description: "description" //只能接 fullcalendar 中 event(在fullcalendar顯示的每一筆行程)的參數
}, //後端有擁有這四個屬性的pojo,封裝從資料庫撈的值再傳到前端
error: function() {
alert('有錯!');
}
}],
eventRender: function(event, element) {
element.find('.fc-title').after("<span>" + event.description + "</span>");
//行事曆上的每一筆 event 沒有 show 出 description 的地方, 就用.after()自己設一個
element.attr( 'data-description', event.description );
//這是用來過濾要show或是要hide甚麼資料用的
element.attr( 'data-title', event.title );
}
});
只記錄 " eventSources " 可以取得多個資料來源
與 " eventRender " , 當每一筆資料被渲染在 fullcalendar 時, 可以修改這筆資料的 DOM
P.S 對其他參數有興趣請參考:https://fullcalendar.io/download
下載後有很多範例可供參考, notepad++ 直接開裡面的範例就可以看到其他的參數
至於 POJO 我是這樣寫的...
import org.springframework.stereotype.Component;
@Component
public class Event {
private String title;
private String start;
private String end;
private String description;
//...以下省略,都是setter與getter
}
2.建立 select
<select id="selectId" >
<option value="Java">java</option>
<option value="python">python</option>
<option value="C">C</option>
<option value="C++">C++</option>
</select>
這裡的值會跟行事曆裡面的 data-description 對應到
3.一旦 filter 被切換項目, 將沒有被選擇到的部分都藏起來
比如說我有 java, C++, C, python 這四個選項
而撈出來的每筆 event 資料中的 description , 會是這 4 個選項其一
假設我選了java, 那麼每一個 event 中 data-description 這個屬性中不是java的就不能讓user看到, 是java就show出來
$('#selectId').change(function(){
//先show出所有的課程
$('#selectId').each(function() {
$("a[data-description='" + $(this).val() + "']" ).show();
});
//取得沒被選擇的所有選項串成字串
var str = "";
$('#selectId').find("option:not(:selected)").each(function() {
str += $( this ).val() + ",";
});
//將字串分割, 在迴圈內將 與沒有被選擇的 event 藏起來
for(var i = 0; i<arr.length; i++){
//event 實際上就是 <a></a>, 要讓整個 event 不見就要控制它
//取得data-description為arr[i] 的 <a>,再 hide
$("a[data-description='" + arr[i] + "']" ).hide();
}
});
總結:
其實讓每個 html 元素的 data-* attribute 設定跟 select 裡面的選項相同
再去操作他們我自己覺得挺方便的
但在網路上我比較常看到
一輸入string就把裡面有string的資料過濾出來,
不是的藏起來這種寫法 ( 在 jQuery datatable 套件的範例就找到蠻多 )
上面寫的部分缺少了後端程式, 跟實際上測試的效果
心情好&&有時間時, 我再自己補起來...
2018.8.21 增加 POJO 的code