2009-03-27 27 views
5

Tôi đang sử dụng khuôn khổ ExtJS và tôi phải xử lý sau đó được sử dụng chỉ như một handler cho một nút:Làm cách nào để thêm các tham số bổ sung vào trình xử lý ExtJS?

var myButtonHandler = function(button, event){ 
    //code goes here 
}; 

định nghĩa nút của tôi trông như thế này:

var myButton = new Ext.Button({ 
     id : 'myButton', 
     renderTo : 'mybutton', 
     text : 'Save', 
     handler : myButtonHandler, 
     scope : this 
    }); 

Như bạn có thể nhìn thấy , trình xử lý nhận được "nút" và "sự kiện" được mong đợi. Tuy nhiên, tôi muốn chuyển một số thông tin bổ sung vào trình xử lý của tôi. Tôi sẽ làm như thế nào?

Trả lời

7

tôi sẽ thực sự sử dụng EXTS createDelegate nguyên mẫu.

var appendBooleanOrInsertionIndex = 0; // Inserts the variables into the front of the function. 
    appendBooleanOrInsertionIndex = true; // Appends the variables to the end of the arguments 

var myButton = new Ext.Button({ 
    id : 'myButton', 
    renderTo : 'mybutton', 
    text : 'Save', 
    handler : myButtonHandler.createDelegate(this, [param1, param2], appendBooleanOrInsertionIndex), 
    scope : this 
}); 
+1

Đây là câu trả lời trang nhã hơn Seb. Công việc tạo một wrapper bị ẩn bởi createDelegate. Tùy chọn, người dùng có thể thêm thuộc tính tùy chỉnh vào nút và kiểm tra điều đó từ trình xử lý. Tôi vẫn thích createDelegate. –

+0

Vì vậy, làm thế nào bạn sẽ xử lý này bên trong của ** myButtonHandler ** chức năng sử dụng [params] của bạn? Chỉ myButtonHandler ([params])? – dmackerman

+0

Tôi đã tiếp tục và sửa đổi ví dụ để hiển thị tốt hơn những gì bạn có thể làm với createDelegate. Cũng trong Ext4 và SenchaTouch createDelegate đã được di chuyển ra khỏi nguyên mẫu hàm và bây giờ chỉ có thể truy cập bằng Ext.createDelegate (functionToDelegate, scope, args, appendOrInsertIndex) – Ballsacian1

3

Tôi không biết là những gì nó mà bạn muốn vượt qua, nhưng sử dụng một wrapper có thể giúp:

var myButtonHandler = function (button, event, additionalData){ 
    //code goes here 
}; 

var myButton = new Ext.Button({ 
    id : 'myButton', 
    renderTo : 'mybutton', 
    text : 'Save', 
    handler : handlerWrapper, 
    scope : this 
}); 

var handlerWrapper = function (button, event){ 
    // Fetch additional data 
    var additionalData = "whatever"; 
    myButtonHandler(button, event, additionalData); 
}; 
+0

Tôi đoán "var handlerWrapper()" phải là "hàm handlerWrapper()". Vâng? – Huuuze

+0

Vâng, xin lỗi ... đã sửa lỗi đó ngay bây giờ. Cảm ơn. – Seb

4

Trong Ext JS 4:

Ext.bind(myButtonHandler, this, [params array], true); 
+0

+1 Đây là giải pháp 1 dòng thực sự tốt cho ExtJS 4+. – BenSwayne

+0

Điều này cũng đúng với ExtJS 3.4 (Sử dụng Ext.createDelegate) – lcguida

5

Bạn có thể sử dụng một giải pháp tốt như Bradley đã gợi ý. Đây là một ví dụ. Trường hợp repeatsStore - đó là tham số bổ sung mà tôi muốn chuyển tới trình xử lý nút.

Ext.create('Ext.panel.Panel', { 
    name: 'panelBtn', 
    layout: 'hbox', 
    border: 0, 
    items:[ 
     {xtype: 'button', text: 'Add', name:'addBtn', 
     handler : Ext.bind(this.addBtnHandler, this, repeatsStore, true) 
     } 
    ] 
}); 

Và trình xử lý của bạn phải có ba tham số - đầu tiên là hai tham số và cuối cùng là của bạn.

addBtnHandler:function(button, event, repeatsStore) 
{ 
} 
Các vấn đề liên quan