2011-10-06 28 views
20

Tôi đang triển khai bảng điều khiển lưới có bốn cột cuối cùng có thể chỉnh sửa cho hầu hết các hàng. Vấn đề là tôi muốn có khả năng vô hiệu hóa việc chỉnh sửa, giả sử người đầu tiên nếu record.get ('status') = 4 được hoàn thành và chỉ có hai cột có thể chỉnh sửa được.ExtJS 4 RowEditing vô hiệu chỉnh sửa trên một cột dựa trên bản ghi

Có cách nào để tắt hiển thị chỉnh sửa cho các hàng đó không? Tôi có thể làm điều đó bằng cách sử dụng CellEditing nhưng muốn tiếp tục sử dụng plugin RowEditing.

Kính trọng, Kristian

Trả lời

37

Sử dụng beforeedit sự kiện:

grid.on('beforeedit', function(editor, e) { 
    if (e.colIdx === 0 && e.record.get('status') == 4) 
    return false; 
}); 

CẬP NHẬT
Các giải pháp trên không làm việc cho rowEditor.
Tuy nhiên, bạn có thể làm cho trường cần thiết bị vô hiệu hóa trên beforeedit. Để làm điều đó bạn sẽ có thể truy cập vào plugin chỉnh sửa hàng. Gán pluginId để cắm:

plugins: [ 
    Ext.create('Ext.grid.plugin.RowEditing', { 
     clicksToEdit: 1, 
     pluginId: 'rowEditing' 
    }) 
], 

Bây giờ chỉ cần vô hiệu hóa lĩnh vực cần thiết nếu một số điều kiện được đáp ứng:

grid.on('beforeedit', function(editor, e) { 
    if (e.record.get('status') === 4){ 
     grid.getPlugin('rowEditing').editor.form.findField('fieldToDisable').disable(); 
    } 
    else{ 
     grid.getPlugin('rowEditing').editor.form.findField('fieldToDisable').enable(); 
    }); 

Đây là demo (cố gắng chỉnh sửa dòng đầu tiên).

Sửa

Nếu ở trên JSFiddle không hoạt động, hãy thử its updated version.

+1

Có, điều đó sẽ hoạt động đối với CellEditing. Đối với RowEditing, nó sẽ chỉ kích hoạt trước một lần cho mỗi hàng chứ không phải mỗi cột. – Asken

+1

@Asken, bạn nói đúng. Đã cập nhật câu trả lời của tôi. –

+0

Rực rỡ! Làm việc như người ở. Đã cố gắng giữ một trường biểu mẫu nhưng tôi đã bỏ qua hàm findField. Cảm ơn! – Asken

1

(dựa trên ví dụ trước) một cách thay thế là cấu hình của trình soạn thảo beforeedit nghe:

listeners: { 
    beforeedit: function(editor, context) { 
     var form = editor.getEditor().form; 
     var field = form.findField('column_name'); 
     var status = parseInt(context.record.data.status); 
     if(status === 4){field.disable();} else {field.enable();} 
    } 
} 
+0

đây là một sự lặp lại của @Molecular Man trả lời – alexandre1985

+0

@ alexandre1985 nó không phải là vì người nghe được định nghĩa toàn bộ một cách khác nhau; hãy tìm hiểu về 'Ext.define' trước khi bỏ phiếu xuống. –

+0

@ alexandre1985 hãy học cách đọc/ghi và hiểu - cũng như kịch bản ExtJS, ngay từ đầu; BÂY GIỜ tôi đã bình chọn câu trả lời của bạn ... bởi vì nó cho thấy rõ ràng đầu mối bạn có về những gì bạn đang nói ... và tôi không phải là người duy nhất có ý kiến ​​này :) –

-2

Kể từ @Molecular Man câu trả lời làm cho cột khuyết tật trông buồn cười khi rowediting được chỉnh sửa tôi nghĩ một cách khác trông hoàn hảo. Tất cả bạn phải làm là tạo một hàm, đó có thể là ví dụ:

function fieldFormat() { 
    if(isGuest) { 
     return null; //is not editable 
    } else { 
     //how you want the column's field config to be formated 
     var json = Ext.JSON.decode("{xtype: 'textfield',maxLength: 40}"); 
     return json; 
    } 
} 

và trong lưới điện, bạn đặt một cái gì đó như thế này:

var grid = Ext.create('Ext.grid.Panel', { 
    plugins: [grid_rowEditing], 
    store: store, 
    columns: [ 
    { 
     text  : 'Name', 
     dataIndex: 'name', 
     field : fieldFormat() 
    }] 
}); 

và khi isGuest là đúng trường 'tên' sẽ không thể chỉnh sửa được. Khi nó sai, nó sẽ có thể chỉnh sửa

+0

công trình này, tại sao bạn lại bỏ phiếu xuống? – alexandre1985

Các vấn đề liên quan