iT邦幫忙

0

已刪文

看更多先前的討論...收起先前的討論...
a05151988 iT邦新手 3 級 ‧ 2023-08-02 13:52:36 檢舉
switchElement.change這個event是什麼用途? 為什麼需要點了就重新draw?
`switchElement.change()` 我縮減了些代碼,不然原來的太長
原本是用來做,如果從server load下來是true, 就把switch調成true,反之也是。
跟對比有調整新的更動,在送給server

`為什麼需要點了就重新draw?`這個是我困擾的點,跟"失敗影片"呈現的一樣,點其他頁的資料會自動跳到第一頁(但我不想)我想就hold在同頁
greenriver iT邦研究生 5 級 ‧ 2023-08-03 08:22:22 檢舉
你可能要先提供換頁的function,
像是function nextPage(){},function prevPage(){},
還有目前所在頁面的變數currentPage,
才能知道發生甚麼事
謝謝@greenriver 哥的回覆,我在下面有貼full version 的code了,主要change page 都是datatable 內建的邏輯

我稍早前有解決了,謝謝哥點的方向!
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

4
揮揮手
iT邦研究生 5 級 ‧ 2023-08-02 15:39:55
最佳解答

1.資料源有幫你作分頁的不同資料嗎
2.是全部打給你自己分的話 要注意分頁的資料 跟分頁的方式
如 筆數100 用陣列群組的方式
1頁 20筆 來分組
在切換的頁的時候 呼叫相對應的群組繪製
同ID那塊DataTable
應該就可以

看影片應該是eventWebAPI那邊
你用我上面的邏輯來切割分頁資料
每次點擊頁面的時候就用該群組來重繪

看更多先前的回應...收起先前的回應...

1.我是自己分,同個資料源根據id 分類成alarm event
2.我應該是有分好資料,不確定能不能達成"在切換的頁的時候 呼叫相對應的群組繪製"

揮揮手大神,我這邊是有比較全的code, 有把問題中原本省略掉的部分補上

function modalTable_WEBAPI_event() {
  const getToken = localStorage.getItem("token");
  var getData;

  var datatable_WEBAPI_event = $("#id_datatable_WEBAPI_event").DataTable({
    ajax: {
      url: "http://192.168.10.01:1000/api/message/all_item",   //fake api
      headers: {
        'Authorization': 'Bearer ' + getToken
      },
      dataSrc: function (response) {
        console.log("DATA MODAL TABLE", response.data);
        getData = response.data.map(obj => {
          let result = JSON.parse(JSON.stringify(obj))
          result['isChanged'] = false //給予變數
          return result
        })

        console.log('DATA CHANGe', getData)

        return getData;
      },
    },
    destroy: true,
    
    columns: [
      { data: "sf", title: "sf" },
      { data: "code", title: "code" },
      { data: "subcode", title: "subcode" },
      { data: "msgtext", title: "msgtext" },
      { data: "description", title: "description_webapi_event" },
      {
        data: null,
        title: "Alarm/Event Setting",
        render: function (data, type, row) {
          var switchId = 'customSwitch_' + row.id; 
          var switchHTML = '<div class="custom-control custom-switch">';
          var isChecked = row.webapi ? 'checked' : ''; 
          // 檢查 rowData.webapi 是否為 true,如果是,則添加 checked 屬性
          switchHTML += '<input type="checkbox" class="custom-control-input" id="webapi_' + switchId + '" ' + isChecked + '>';
          switchHTML += '<label class="custom-control-label" for="webapi_' + switchId + '">Selected_webapi</label>';
          switchHTML += '</div>';
          return switchHTML;
        },
        createdCell: function (td, cellData, rowData, row, col) {
          var switchId = 'customSwitch_' + rowData.id; 
          var switchElement = $(td).find('#webapi_' + switchId);
          console.log("WEBAPI Element: ", switchElement);
          var isChecked = rowData.webapi ? 'checked' : ''; 
          // 根據 rowData.webapi 設置 isChecked 變數

          switchElement.change(function () {
            console.log("WEBAPI switchId: ", switchId);
            console.log("WEBAPI isChecked: ", isChecked);
            console.log("WEBAPI switchElement: ", switchElement);
            if ($(this).is(':checked')) {
              rowData.webapi = true;
              rowData.isChanged = true;
            } else {
              rowData.webapi = false;
              rowData.isChanged = true;
            }
            var selectedRows = datatable_WEBAPI_event.rows({ selected: true }).data();
            console.log("Selected Rows >>>>>", selectedRows);
            webapi_server.data = selectedRows.map(function (row) {
              return { id: row.id, enable: row.webapi };
            });
            webapi_server.length = webapi_server.data.length;
            webapi_server.server = "webapi";
            console.log("Selected Rows:", webapi_server);
            var changedData = getData.filter(item => item.isChanged == true);
            console.log("Changed Data:", changedData);

            console.log("changedData webapi", changedData);

                // 將 changedData 轉換成所需的格式
            var changedData_to_jsonAPI_webapi_0 = changedData.map(item => ({
              id: item.id,
              enable: item.webapi
            }));
            console.log("changedData_to_jsonAPI_webapi_0", changedData_to_jsonAPI_webapi_0);

                // 將轉換後的數據添加到目標物件中
            changedData_to_jsonAPI_webapi = {
              draw: 1,
              length: changedData_to_jsonAPI_webapi_0.length,
              server: "webapi",
              data: changedData_to_jsonAPI_webapi_0
            };
            console.log("changedData_to_jsonAPI_webapi:", changedData_to_jsonAPI_webapi);

            datatable_WEBAPI_event.draw();

                        setTimeout(function() {
              datatable_WEBAPI_event.ajax.reload(null, false);
                }, 30000); 
            });
          }
        },
      ]
    });

      // 初始化 tab 在 WEBAPI 
  $('#webapiTabs a').click(function (e) {
    e.preventDefault();
    $(this).tab('show');
  });

  // 過濾“sf”為“S06F11”的數據 (S06F11 = event代號)
  datatable_WEBAPI_event.column(0).search('S06F11').draw();
揮揮手 iT邦研究生 5 級 ‧ 2023-08-02 16:52:52 檢舉

你要接著分
再來 每頁的比數 是由你設定的select 來處理
alarm : [[page1資料],[page2資料],[page3資料].....]
event : [[page1資料],[page2資料],[page3資料].....]

揮揮手 iT邦研究生 5 級 ‧ 2023-08-02 16:54:33 檢舉

你確定你有分好資料
那你就直接用你分好資料的來畫table

我記得前幾個問題
你已經會用資料重繪表格這件事情了

我現在 已經有分成alarm跟 event table 了鴨
1.有辦法加類似這個直接解決嗎?

setTimeout(function() {
datatable_FTP.ajax.reload(null, false);
}, 30000);

2.還是需要重畫,分頁,才有效嗎(點其他頁資料不會跳回第一頁)?
(✿╹◡╹)

揮揮手 iT邦研究生 5 級 ‧ 2023-08-02 17:38:06 檢舉

https://datatables.net/reference/event/page
你要用datatable 就全部用他們的功能來寫
他套件很完善

揮揮手 iT邦研究生 5 級 ‧ 2023-08-02 17:42:11 檢舉
setTimeout(function() {
datatable_FTP.ajax.reload(null, false);
}, 30000);

你知道這段 只是更新資料不reload 的意思嗎

那是不是有可能你作了什麼事
影響你頁面重畫了table

好我又不小心搞定了
不過謝謝大家的建議,給的方向正確又有耐心,不然我也不會誤打誤撞到能弄成功

  1. table.draw(); 別寫在table 裡,可能會卡迴圈
  2. api我從 get 換成 post 確保default table 翻頁是ok的 (default原本設計就是用post)

成功影片在第3個


function modalTable_WEBAPI_alarm() {
  const getToken = localStorage.getItem("token");
  var getData;
  var currentPage = 1;

  var datatable_WEBAPI_alarm = $("#id_datatable_WEBAPI_alarm").DataTable({
    processing: true,
    lengthChange: false,
    serverSide: true,
    ajax: {
      url: "http://192.168.10.01:1000/api/message/all_item",   //fake api
      headers: {
        'Authorization': 'Bearer ' + getToken
      },
      type: "POST", 
      contentType : 'application/json',
     
      // 省略
    },
    destroy: true,
    columns: [
      { data: "sf", title: "sf" },
      { data: "code", title: "code" },
      { data: "subcode", title: "subcode" },
      { data: "msgtext", title: "msgtext" },
      { data: "description", title: "description_webapi_alarm" },
      
      // 省略
        
        createdCell: function (td, cellData, rowData, row, col) {
          var switchId = 'customSwitch_' + rowData.id; // Assuming you have an 'id' field in your data
          var switchElement = $(td).find('#webapi_' + switchId);
          console.log("WEBAPI Element: ", switchElement);
          var isChecked = rowData.webapi ? 'checked' : ''; // 根據 rowData.webapi 設置 isChecked 變數
         
                // 將 changedData 轉換成所需的格式
            var changedData_to_jsonAPI_webapi_0 = changedData.map(item => ({
              id: item.id,
              enable: item.webapi
            }));
            console.log("changedData_to_jsonAPI_webapi_0", changedData_to_jsonAPI_webapi_0);

                // 將轉換後的數據添加到目標物件中
            changedData_to_jsonAPI_webapi = {
              draw: 1,
              length: changedData_to_jsonAPI_webapi_0.length,
              server: "webapi",
              data: changedData_to_jsonAPI_webapi_0
            };
            console.log("changedData_to_jsonAPI_webapi:", changedData_to_jsonAPI_webapi);
 
            });

          
            // datatable_WEBAPI_alarm.draw();  原本在這是錯的,會在迴圈裡
           
          }
        },
      ]
    });
  
    datatable_WEBAPI_alarm.draw();
    
  // Initialize the tabs in the WEBAPI modal
  $('#webapiTabs a').click(function (e) {
    e.preventDefault();
    $(this).tab('show');
  });
1
greenriver
iT邦研究生 5 級 ‧ 2023-08-02 14:07:10

因為你的var currentPage = 1;
放在function modalTable_WEBAPI_alarm() {}裡面的關係吧?

datatable_WEBAPI_alarm.ajax.reload(null, false);的時候,
又會將currentPage設定成1,所以又回到第一頁。

看更多先前的回應...收起先前的回應...
greenriver iT邦研究生 5 級 ‧ 2023-08-02 14:07:56 檢舉

我猜的,對DataTable不熟

我的currentPage = 1; 是想試試看,把點的頁數存下來,就算reload了,也是在那頁

var currentPage = 1; // 儲存當前頁數

var datatable_FTP = $("#id_datatable_FTP").DataTable({
  // ... (省略) ...
});

// ... (省略) ...


datatable_FTP.column(0).search('S05F01').draw();
// 保留當前頁面並重新加載表格而不重置分頁

setTimeout(function() {
  currentPage = datatable_FTP.page(); 
// 希望點翻頁碼,能存下來

  datatable_FTP.ajax.reload(function(){
    datatable_FTP.page(currentPage).draw('page'); 
// reload 後設置回存儲的頁碼 
  }, false);
},3000);

但失敗了

froce iT邦大師 1 級 ‧ 2023-08-02 15:11:51 檢舉

阿你跳轉頁面後,整個頁面都會重設,變數都得重新初始化,當然會回到第一頁...

自己去查localStorage如何操作或是去查如何操作網址後面參數。

揮揮手 iT邦研究生 5 級 ‧ 2023-08-02 15:47:34 檢舉

真的,感覺樓主就是有概念,卡在奇怪的點,最後解決了。
所以打算回答方向就好。

froce大神,可是上一題用類似的reload 可以捏? 「(°ヘ°)

setTimeout(function() {
datatable_FTP.ajax.reload(null, false);
}, 30000);
froce iT邦大師 1 級 ‧ 2023-08-02 16:27:21 檢舉

所以我從一開始就懶得回他真正的code啊...

哈哈,抱歉,我有時會卡在奇怪地方/images/emoticon/emoticon82.gif

greenriver iT邦研究生 5 級 ‧ 2023-08-03 08:35:41 檢舉

我先提供我的寫法給你參考,

let info = {
    data:[], //ajax收到的資料
    currentPage:1 //要顯示的頁面
}
const nextPage = ()=>{
    //先判斷總共有幾頁,才能換頁
    let totalPage = info['data'].length
    if(totalPage > info['currentPage']){
        info['currentPage']++
    } 
}
const prevPage = ()=>{
    if(info['currentPage'] > 1){
        info['currentPage']--
    } 
}
const getInfo = ()=>{
    //ajax的地方,將接收到的資料更新到info['data']裡
    //這裡不能修改到info['currentPage'],就能維持目前頁面
}

總而言之,就是currentPage必須要放在ajax的function外面。

我要發表回答

立即登入回答