iT邦幫忙

0

ExtJS 製作 checkboxgroup 新增/刪除 item 問題

  • 分享至 

  • xImage

雖然經歷了chrome當機事件..(見聊天室)
還我打的內容不見..
不過..在下對於ExtJS的知識還很短淺..
還是上來簡短發問..

先給一段大概的CODE:

var newform = new Ext.form.FormPanel({
  items:[
    {
      xtype:'button',
      text: 'add checkbox',
      handler: function() {
        //點擊按鈕後 至後台PHP讀取json 此段json後面會解釋
        Ext.Ajax.request({
            method: 'POST', 
            url:'getCheckBox.php',
            success: function(response,params) {
                var Grpform = Ext.getCmp('CheckBoxGrp');
                //將取得的json decode 給 result
                var result = Ext.JSON.decode(response.responseText);
                //下面判斷式是為了防止重複按鈕時重複新增checkbox
                //因此判斷CheckBoxGroup裡面若有item則依序刪除
                if (Grpform.items.length != 0) {debugger;
                    for (var i=0; i<result.length; i++) {
                        Grpform.remove(Grpform.items.items[1]);
                    }
                }
                //下面迴圈是將抓來的json(checkbox)依序加入item中
                for (var i=0; i<result.length; i++) {
                    var tempObj = new Ext.form.Checkbox({
                        boxLabel:result[i].boxLabel,
                        name: result[i].name,
                        inputValue: result[i].inputValue
                    });
                    Grpform.items.add(tempObj);
                }
                Grpform.updateLayout();//更新新增後的表單
            }
        });
    }
    },{
      xtype: 'checkboxgroup',
      id: "CheckBoxGrp",
      name: "CheckBoxGrp",
      columns: 2,
      width: '100%'
    }
  ]
})

上面是UI部份
以下是PHP部份
PHP部份會處理從SQL抓來的資訊
並重組為JSON字串回傳給前端(也就是上面的UI)
以下是組好的JSON CODE:(舉例版~沒辦法~商業機密~XD)

<?php
echo "[
{'boxLabel':'Item1','name':'chb1','id':'chb1','inputValue':'value1'},{'boxLabel':'Item2','name':'chb2','id':'chb2','inputValue':'value2'},{'boxLabel':'Item3','name':'chb3','id':'chb3','inputValue':'value3'},]";
?>

以上~敘述完了~~
來說明我的問題...
有問題的是下面這段UI裡面的CODE..

上面是UI部份
以下是PHP部份
PHP部份會處理從SQL抓來的資訊
並重組為JSON字串回傳給前端(也就是上面的UI)
以下是組好的JSON CODE:(舉例版~沒辦法~商業機密~XD)

//下面判斷式是為了防止重複按鈕時重複新增checkbox
//因此判斷CheckBoxGroup裡面若有item則依序刪除
if (Grpform.items.length != 0) {debugger;
for (var i=0; i<result.length; i++) {
Grpform.remove(Grpform.items.items[1]);
}
}

原本沒加這段時..
按按鈕會出現重複add的Bug~
於是才新增這斷判斷式~
但加完之後~卻出現錯誤~
然後畫面上的form就出現像是破圖的情況~
進入debugger模式..
錯誤訊息如下..

Uncaught TypeError: Cannot read property 'children' of undefined(…)

我大概知道是因為加了remove刪除item導致
但邏輯上..刪除在新增好像可行~
請問remove後再add Item有甚麼問題
另外..有其他作法嗎?

看不懂..歡迎發問~XD
看更多先前的討論...收起先前的討論...
daimom iT邦新手 2 級 ‧ 2017-03-24 09:44:14 檢舉
我只想問...你是要做什麼?
daimom iT邦新手 2 級 ‧ 2017-03-24 10:50:04 檢舉
你都用remove了不直接用removeAll 刪除全部嗎?這樣還不用一個一個刪除。
出現那個錯誤,應該是刪除的東西跟裡面元件的不相符。
終於有人問問題了~~
有點小感動~T~T

這裡沒辦法畫圖...
需要想像一下~

因為專案需求~
畫面上會有個搜尋人員ID的區塊..
下面一個區塊是一個checkboxgroup..
如我上面的CODE一樣~
預設group裡面沒有任何checkbox
button部份是搜尋人員用~
當我按下button後
會根據人員ID至後台搜尋與他相關的資訊~
這些資訊會在後台PHP重組成json後回傳至前端~
json格式如上面我給的~會組成要產生checkbox的格式

前因講完~講後果~~

當我要搜尋第二個人員時~
會發生~第二個人員的資訊(checkbox)會從第一個人員的資訊往後繼續增加~
於時我加入remove的功能~
有點像是初始化checkboxgroup一樣~
讓group回到預設狀態~
就是在這裡出問題的~

以上~故事~講完~^—^
希望對你有幫助~^^
事實上~
刪除是可以刪除~
但是~
程式會跑到這行 -> Grpform.updateLayout();//更新新增後的表單
出現我說的錯誤~
變成無法新增~
無法新增就算了~~
連搜尋區塊也跟著不見~
daimom iT邦新手 2 級 ‧ 2017-03-24 11:08:07 檢舉
http://jsfiddle.net/mike_ruggieri/9vbqh8vt/
這是剛弄出來的你參考,按下clear後會清除後重新新增。
ㄜ....
不好意思~~~~~
clear在......哪裡...??
想說...你會不會貼錯網址了~~0..0
daimom iT邦新手 2 級 ‧ 2017-03-24 11:34:50 檢舉
http://jsfiddle.net/9vbqh8vt/2/
改這個
謝謝你的解答~
因為你的解答~
我簡化了兩三行程式~
不過...
真正的問題還是沒解決~
我的checkbox我預設會新增4個~
第一次新增正常~
第二次新增~原本的remove後~只新增了兩個~
就跳出以下錯誤~
Uncaught TypeError: Cannot read property 'children' of undefined(…)

我嘗試新增6個~
第二次還是會停在第二個~

我嘗試新增2個~
反到正常了....= =
daimom iT邦新手 2 級 ‧ 2017-03-24 14:01:09 檢舉
所以..你第三個的資料有問題?
你要不要用console.log將資料撈出來看看?
我資料都長一樣耶~
<?php
echo "[
{'boxLabel':'Item1','name':'chb','inputValue':'value1'},{'boxLabel':'Item2','name':'chb','inputValue':'value2'},{'boxLabel':'Item3','name':'chb','inputValue':'value3'},{'boxLabel':'Item4','name':'chb','inputValue':'value4'}]";
?>
我沒有設ID~所以應該不是ID衝突~
我有用開發者看過ExtJS自己產生的ID~
第一次依序是
checkbox-1016-inputEl、checkbox-1017-inputEl.....checkbox-1021-inputEl
第二次會從checkbox-1022-inputEl開始產生
daimom iT邦新手 2 級 ‧ 2017-03-24 14:45:17 檢舉
你新增6筆的資料也一樣?
你上面的那個data是php產生出來的,
確認一下前端也是撈到同樣的東西,
所以在 //下面迴圈是將抓來的json(checkbox)依序加入item中
for (var i=0; i<result.length; i++) {
....
這邊加上console.log(result)
}
看每個result的值,然後確認是不是都有進去array
他依序console出來的值都有確實進去~
我有開啟開發者~
下了debugger去一步一步執行下面那段~
並觀看每一個值~
for (var i=0; i<result.length; i++) {
var tempObj = new Ext.form.Checkbox({
boxLabel:result[i].boxLabel,
name: result[i].name,
inputValue: result[i].inputValue
});
Grpform.add(tempObj);
}

跑第一次回圈~
值都有加進boxLabel....等
並且Grpform.add(tempObj);出來~產生checkbox物件~

跑第二次回圈~
值都有加進boxLabel....等
並且Grpform.add(tempObj);出來~產生checkbox物件~

跑第三次回圈~
值都有加進boxLabel....等
但是!!!!執行到Grpform.add(tempObj);
畫面就終止了~
並且在開發者的訊息視窗出現
Uncaught TypeError: Cannot read property 'children' of undefined(…)
的錯誤訊息

順便提一下~
這是在按下第二次按鈕後~
也就是開始執行removeAll之後
才有的問題~
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友回答

立即登入回答