EXTJS - วิธีกำหนดเป้าหมายอินพุตช่องทำเครื่องหมายที่แสดงผลในกริด

ฉันมีตาราง EXT ที่มีช่องทำเครื่องหมายและตัวเลือกเพิ่มเติมใน 2 คอลัมน์สุดท้ายโดยใช้ตัวแสดงภาพ เมื่อฉันตรวจสอบรายการในตารางและดูแหล่งที่มา ฉันไม่เห็นการกำหนด check:checked ใน HTML ดังนั้นฉันจึงประสบปัญหาในการกำหนดเป้าหมายองค์ประกอบ

เมื่อเลือกแถวแล้ว ฉันต้องการตรวจสอบว่าได้ทำเครื่องหมายในช่องหรือไม่ ฉันกำลังดำเนินการดังนี้:

if (document.getElementById("#isFull-"+record['index']+"").checked == true){
    var myVar = true;
}

มีวิธีอื่นที่ฉันสามารถกำหนดเป้าหมายองค์ประกอบนี้เพื่อดูว่ามีการตรวจสอบหรือไม่

นี่คือรหัสเต็ม:

Ext.onReady(function () {

    Ext.QuickTips.init();

    // Data store
    var data = Ext.create('Ext.data.JsonStore', {
        autoLoad: true,
        fields: ['name', 'market', 'expertise', 'id', 'isFull', 'isPrimary'],
        proxy: {
            type: 'ajax',
            url: '/opsLibrary/getLibraryJson'
        }
    });

    // Selection model
    var selModel = Ext.create('Ext.selection.CheckboxModel', {
        columns: [{
            xtype: 'checkcolumn',
            text: 'Active',
            dataIndex: 'id'
        }],
        listeners: {
            selectionchange: function (value, meta, record, rowIndex, colIndex) {
                var selectedRecords = grid4.getSelectionModel().getSelection();
                var selectedParams = [];

                // Clear hidden input
                $('#selected-libraries').empty();
                var record = null;
                var myVar = null;
                var myVar2 = null;

                for (var i = 0, len = selectedRecords.length; i < len; i++) {
                    record = selectedRecords[i];

                    // Is full library checked?
                    myVar = !Ext.fly("isFull-" + data.indexOf(record)).dom.checked;

                    // Build data object
                    selectedParams.push({
                        id: record.getId(),
                        full: myVar

                    });
                }
                // JSON encode object and set hidden input
                $('#selected-libraries').val(JSON.stringify(selectedParams));

            }
        }
    });

    // Render library grid
    var grid4 = Ext.create('Ext.grid.Panel', {
        xtype: 'gridpanel',
        id: 'button-grid',
        store: data,
        columns: [{
            text: "Library",
            width: 170,
            sortable: true,
            dataIndex: 'name'
        }, {
            text: "Market",
            width: 125,
            sortable: true,
            dataIndex: 'market'
        }, {
            text: "Expertise",
            width: 125,
            sortable: true,
            dataIndex: 'expertise'
        }, {
            text: 'Full',
            dataIndex: 'isFull',
            width: 72,
            renderer: function (value, meta, record, rowIndex, colIndex) {
                return '<center><input type="checkbox" onclick="var s = Ext.getCmp(\'button-grid\').store; s.getAt(s.findExact(\'id\',\'' + record.get('id') + '\')).set(\'isFull\', this.value)"'
            }
        }, {
            text: 'Primary',
            dataIndex: 'isPrimary',
            width: 72,
            renderer: function (value, meta, record, rowIndex, colIndex) {
                return '<center><input type="radio" id="isPrimary-' + rowIndex + '"/></center>';
            }
        }, ],
        columnLines: false,
        selModel: selModel,
        width: 600,
        height: 300,
        frame: true,
        title: 'Available Libraries',
        iconCls: 'icon-grid',
        renderTo: Ext.get('library-grid')
    });
});

รูปแบบการเลือกที่อัปเดต:

// Selection model
var selModel = Ext.create('Ext.selection.CheckboxModel', {
    columns: [{
        xtype: 'checkcolumn',
        text: 'Active',
        dataIndex: 'id'
    }],
    listeners: {
        selectionchange: function (value, meta, record, rowIndex, colIndex) {
            var selectedRecords = grid4.getSelectionModel().getSelection();
            var LastSelectedRecords = grid4.getSelectionModel().getLastSelected();
            var selectedParams = [];

            // If user unselected ID then make sure Full & Primary boxes cleared
            if (grid4.getSelectionModel().getSelection() == "") {
                // Get row ID
                Ext.fly('isFull-' + LastSelectedRecords['index']).dom.checked = false;
                Ext.fly('isPrimary-' + LastSelectedRecords['index']).dom.checked = false;
            }

            // Clear input and reset vars
            $('#selected-libraries').empty();
            var record = null;
            var myVar = null;
            var myVar2 = null;

            // Loop through selected records
            for (var i = 0, len = selectedRecords.length; i < len; i++) {
                record = selectedRecords[i];

                // Is full library checked?
                myVar = record.get('isFull');

                // Is this primary library?
                myVar2 = record.get('isPrimary');

                // Build data object
                selectedParams.push({
                    id: record.getId(),
                    full: myVar,
                    primary: myVar2
                });
            }
            // JSON encode object and set hidden input
            $('#selected-libraries').val(JSON.stringify(selectedParams));
            console.log(JSON.stringify(selectedParams));
        }
    }
});

person xXPhenom22Xx    schedule 24.07.2013    source แหล่งที่มา
comment
คอลัมน์กาเครื่องหมายจะไม่แสดงอินสแตนซ์ของช่องทำเครื่องหมายจริงตามที่คุณอาจเดาได้ มันเพียงแสดงภาพด้วยตัวฟังการคลิกที่ใช้ หากคุณต้องการทราบว่าสิ่งใดถูกเลือก ฉันขอแนะนำให้คุณใช้แบบจำลองการเลือกที่เหมาะสม จากนั้นคุณสามารถรับข้อมูลทั้งหมดได้อย่างง่ายดาย   -  person sra    schedule 25.07.2013
comment
ฉันจะเปลี่ยนรูปแบบการเลือกเพื่อแสดงช่องทำเครื่องหมายและวิทยุใน 2 คอลัมน์สุดท้ายได้อย่างไร ฉันดูตัวอย่างไซต์ของ EXT ทั้งหมดแล้ว แต่ไม่พบคำตอบหรือตัวอย่างที่ชัดเจน   -  person xXPhenom22Xx    schedule 25.07.2013
comment
หากคุณมีองค์ประกอบอินพุตจำลองหลายรายการ (ฉันเห็นเพียงคอลัมน์ช่องทำเครื่องหมาย) ในกริดของคุณให้ไปกับ beforecellclick เหตุการณ์ของกริดที่จะช่วยให้คุณสามารถระบุเซลล์ที่ถูกคลิก และช่วยให้คุณสามารถแก้ไขบันทึกได้โดยตรง....   -  person sra    schedule 25.07.2013
comment
ทำไมคุณไม่ใช้ CheckColumn ปกติ? นั่นจะช่วยให้คุณพ้นจากปัญหาทั้งหมดนั้นได้...   -  person rixo    schedule 25.07.2013
comment
@rixo นั่นเป็นการเดาครั้งแรกของฉัน แต่นั่นใช้ไม่ได้กับวิทยุ ...   -  person sra    schedule 25.07.2013
comment
@sra มันใช้งานได้: fiddle.sencha.com/#fiddle/32   -  person rixo    schedule 25.07.2013
comment
@rixo เป็นคนดีเช่นเคย ;) และใช่ ฉันพลาดกาแฟแก้วแรกของฉัน .. ฉันคิดถึงรูปแบบการเลือกช่องทำเครื่องหมายหลังจากอ่านความคิดเห็นของคุณ ดังนั้นคำตอบของฉันมันผิด ... ใช่แล้ว นี่เป็นวิธีแก้ปัญหาที่ง่ายที่สุดและสะอาดที่สุด ! คุณควรโพสต์เป็นคำตอบเพราะสิ่งนี้จะใช้ได้กับหลายคอลัมน์ประเภทนั้นด้วย   -  person sra    schedule 25.07.2013


คำตอบ (3)


เรามาลองวิธีอื่นกัน จะเป็นอย่างไรหากคุณตั้งค่าคอลัมน์ตรวจสอบให้ทำดังนี้:

{
    text: 'Full',
    dataIndex:'isFull',
    width: 70,
    renderer: function (value, meta, record, rowIndex, colIndex) {
        return '<center><input type="checkbox" onclick="var s = Ext.getCmp(\'button-grid\').store; s.getAt(s.findExact(\'id\',\'' + record.get('id') + '\')).set(\'isFull\', this.value)" /></center>';
    }
},

สิ่งนี้ควรตั้งค่าลงในบันทึกโดยตรง

person kevhender    schedule 24.07.2013
comment
Uncaught TypeError: ไม่สามารถอ่านคุณสมบัติ 'dom' ของ null buildLibraryGrid.js:41 Uncaught TypeError: Object -1 ไม่มีวิธี 'set' [VM] ใหม่ (7607):1 onclick - person xXPhenom22Xx; 24.07.2013
comment
ID ของคุณไม่ใช่ ints เหรอ? ใส่เครื่องหมายคำพูดล้อมรอบพารามิเตอร์นั้น หากเป็นเช่นนั้น: return '<center><input type="checkbox" onclick="Ext.getCmp(\'button-grid\').store.findExact(\'id\',\'' + record.get('id') + '\').set(\'isFull\', this.value)" /></center>'; - person kevhender; 24.07.2013
comment
id คือ INT ลองใช้ตัวอย่างข้อมูลที่คุณเพิ่งส่งไปแต่กลับมาพร้อมกับข้อผิดพลาดเดิม - person xXPhenom22Xx; 24.07.2013
comment
สำหรับข้อผิดพลาด: Uncaught TypeError: ไม่สามารถอ่านคุณสมบัติ 'dom' ที่เป็นโมฆะได้ ซึ่งชี้ไปที่ myVar = !Ext.fly(isFull- + data.indexOf(record)).dom.checked; - person xXPhenom22Xx; 24.07.2013
comment
อ้าว ผิดเอง ต้องล้อมรอบ findExact ด้วย getAt: onclick="var s = Ext.getCmp(\'button-grid\').store; s.getAt(s.findExact(\'id\',\'' + record.get('id') + '\')).set(\'isFull\', this.value)" - person kevhender; 24.07.2013
comment
Uncaught TypeError: ไม่สามารถอ่านคุณสมบัติ 'dom' เป็นโมฆะ .... อัปเดตโค้ดของฉันด้านบน พฤติกรรมเปลี่ยนไปเล็กน้อย ตอนนี้เมื่อฉันพยายามคลิกรายการ คุณจะพบสามเหลี่ยมสีแดงที่มุมซ้ายบน ถ้าฉันคลิกครั้งที่สอง มันจะเลือกกล่อง - person xXPhenom22Xx; 24.07.2013
comment
ทำไมคุณถึงยังพยายามตั้งค่า myVar แบบนั้น? ควรตั้งค่า ณ จุดนั้นแล้ว คุณสามารถใช้ record.get('isFull') ได้ - person kevhender; 24.07.2013
comment
คุณทำให้ฉันลืมเรื่องนั้นไป คุณกำลังพูดถึงจุดไหนของโค้ด เมื่อฉันล้าง myVar ให้เป็นโมฆะหรือตั้งค่าด้วยบิต !Ext.fly - person xXPhenom22Xx; 25.07.2013
comment
ไม่จำเป็นต้องใช้ส่วน Ext.fly อีกต่อไป เนื่องจากโค้ดช่องทำเครื่องหมายจะตั้งค่าในเรคคอร์ดโดยตรง คุณควรใช้ myVar = record.get('isFull') แทนบรรทัด Ext.fly(...) ได้ - person kevhender; 25.07.2013
comment
อ่า โอเค ฉันพลาดไปแล้ว ทำการเปลี่ยนแปลงและดูเหมือนว่าจะได้ผล! ขอขอบคุณอีกครั้งสำหรับทุกความช่วยเหลือของคุณ! - person xXPhenom22Xx; 25.07.2013
comment
มันจะค่อนข้างง่ายไหมที่จะทำสิ่งต่อไปนี้: หากไม่ได้เลือกช่องทำเครื่องหมาย ID หลักทางด้านซ้าย เพื่อยกเลิกการเลือกทั้งช่องทำเครื่องหมายวิทยุและช่องที่สองโดยอัตโนมัติ ขออภัยสำหรับคำถาม noob ทั้งหมด แบ็กเอนด์ Python guy ที่นี่เพื่อไม่ให้เชี่ยวชาญกับวิถีทางที่ดุร้ายของ JS - person xXPhenom22Xx; 25.07.2013
comment
คุณสามารถเพิ่ม ID กลับเข้าไปในเช็ค/วิทยุ จากนั้นเพียงตั้งค่า Ext.fly(checkboxId).dom.checked = true/false บนองค์ประกอบเหล่านั้นตามต้องการ - person kevhender; 25.07.2013
comment
ฉันอัปเดตโมเดลการเลือกของฉันด้านบน หากมีการเลือกว่าง ระบบจะไปและรับบันทึกที่เลือกล่าสุด และฉันสามารถดึง ID สุดท้ายที่ไม่ได้เลือกได้อย่างน่าเชื่อถือ แต่ฉันได้รับข้อผิดพลาดเมื่อพยายามยกเลิกการตั้งค่าวิทยุหรือช่องทำเครื่องหมาย -- Uncaught TypeError: ไม่สามารถอ่านคุณสมบัติ 'dom' เป็นโมฆะได้ - person xXPhenom22Xx; 25.07.2013

ข้อมูลในบันทึกเข้าถึงได้โดยใช้ฟังก์ชัน get() ไม่ใช่สัญลักษณ์อ็อบเจ็กต์:

if (document.getElementById("isFull-"+record.get('index')).checked == true)
{
    var myVar = true;
}

อีกสองสามประเด็น... คุณกำลังตรวจสอบค่าความจริงโดยใช้ == true ซึ่งจะคืนค่าจริงสำหรับ "ความจริง" ใดๆ คุณจะต้องใช้ === หากคุณต้องการตรวจสอบว่าเท่ากับ true

นอกจากนี้ คุณอาจต้องการพิจารณา Ext.fly() เพื่อรับองค์ประกอบของคุณ ซึ่งเป็นมิตรกับสิ่งแวดล้อมมากกว่า:

if (Ext.fly("isFull-"+record.get('index')).dom.checked === true)
{
    var myVar = true;
}

เพื่อความง่าย คุณสามารถทำได้เพียงทำสิ่งนี้:

var myVar = Ext.fly("isFull-"+record.get('index')).dom.checked;

แก้ไข:

ฉันรู้สึกว่าคุณมี index เป็นหนึ่งในช่องร้านค้าของคุณ แต่ฉันเพิ่งสังเกตเห็นว่าไม่ใช่ คุณจะต้องใช้ store.indexOf(record) เพื่อรับดัชนีที่คุณต้องการ:

var myVar = Ext.fly("isFull-" + data.indexOf(record)).dom.checked;
person kevhender    schedule 24.07.2013
comment
ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อฉันพยายามใช้สิ่งใดสิ่งหนึ่งเหล่านี้ - Uncaught TypeError: ไม่สามารถอ่านคุณสมบัติ 'dom' เป็น null - person xXPhenom22Xx; 24.07.2013
comment
ฉันพิมพ์ผิดในการตอบกลับ คุณไม่ควรใช้ # เมื่อใช้ getElementById หรือ Ext.fly() ลองอีกครั้งโดยไม่มี # - person kevhender; 24.07.2013
comment
ไม่มีลูกเต๋า เมื่อฉันทำเครื่องหมายในกล่องใดกล่องหนึ่ง เหตุการณ์กำลังเริ่มทำงาน แต่ฉันยังคงได้รับกลับมา - Uncaught TypeError: ไม่สามารถอ่านคุณสมบัติ 'dom' เป็นโมฆะได้ เมื่อฉันดูแหล่งที่มาใน Firebug ฉันไม่เห็น 'ตรวจสอบ: ตรวจสอบ' หรืออะไรทำนองนั้น - person xXPhenom22Xx; 24.07.2013
comment
id ของช่องทำเครื่องหมายที่คุณเห็นใน firebug ตรงกับ "isFull-"+record.get('index') ที่คุณกำลังตรวจสอบหรือไม่ ข้อผิดพลาดนั้นดูเหมือนจะบ่งบอกว่าไม่ได้เป็นเช่นนั้น ตรวจสอบ id ใน firebug และทำ console.log("isFull-"+record.get('index')) ในฟังก์ชันของคุณเพื่อดูว่า ID ตรงกันหรือไม่ - person kevhender; 24.07.2013
comment
อันที่จริง ฉันเพิ่งเห็นว่าคุณไม่มีคุณสมบัติดัชนีในบันทึกของคุณ คุณจะต้องการใช้ store.indexOf(record) ฉันจะอัปเดตคำตอบ - person kevhender; 24.07.2013
comment
โอเค ฉันคิดว่าเราใกล้จะถึงแล้ว ตอนนี้เมื่อฉันทำเครื่องหมายในช่อง ฉันเห็น False ก่อน จากนั้นถ้าฉันยกเลิกการทำเครื่องหมาย ฉันจะกลับมาเป็นจริง... var myVar = Ext.fly(isFull- + data.indexOf(record)).dom ตรวจสอบ; console.log(myVar); - person xXPhenom22Xx; 24.07.2013
comment
ให้เราสนทนาต่อในการแชท - person xXPhenom22Xx; 24.07.2013
comment
ฉันถูกบล็อกไม่ให้แชท แต่ selectionchange อาจถูกไล่ออกก่อนที่จะทำเครื่องหมายที่ช่อง ดังนั้นให้ลบล้างค่าที่เลือกแล้วคุณน่าจะไปได้แล้ว: var myVar = !Ext.fly("isFull-" + data.indexOf(record)).dom.checked; - person kevhender; 24.07.2013
comment
นั่นได้ผลเหมือนมีเสน่ห์! ขอขอบคุณอีกครั้งสำหรับความช่วยเหลือของคุณในเรื่องนี้... หากต้องการกำหนดเป้าหมายวิทยุ ฉันสามารถใช้ .checked ได้หรือไม่ - person xXPhenom22Xx; 24.07.2013
comment
วิทยุและช่องทำเครื่องหมายทั้งคู่ใช้ checked ใช่ - person kevhender; 24.07.2013
comment
คิดว่าฉันอาจโดดปืนไปแล้ว... ตารางมีคอลัมน์ของช่องทำเครื่องหมายเช่นกันทางด้านซ้ายสุด เมื่อฉันคลิกว่าฉันได้รับการตอบสนองที่แท้จริงต่อ myVar ที่กำลังถูกตรวจสอบ จากนั้นถ้าฉันคลิกที่ช่องทำเครื่องหมาย ฉันจะกำหนดเป้าหมายที่ myVar ยังคงอยู่ TRUE ถ้าฉันยกเลิกการคลิกช่องทำเครื่องหมาย ฉันกำลังกำหนดเป้าหมาย myVar ให้เปลี่ยนเป็น FALSE ถ้าฉันคลิกในช่องทำเครื่องหมายที่กำหนดเป้าหมาย ดูเหมือนว่าจะตอบสนองอย่างถูกต้อง ดูเหมือนว่าลำดับที่การเริ่มทำงานนี้อาจไม่ถูกต้องใช่ไหม - person xXPhenom22Xx; 24.07.2013

บางที คุณสามารถใช้ผู้ฟังหนึ่งคนในมุมมองกริด:

Sencha api [4.2]: ผู้ฟังบนตาราง/คอลัมน์

 listeners: {
        click: {
            element: 'el', //bind to the underlying el property on the panel
            fn: function(){ 
                 console.log('click el'); 
            }
        },
person mfruizs2    schedule 24.07.2013