2013-04-22 51 views
6

Vì vậy, tôi có một bộ điều khiển đăng nhập, bạn có thể bấm vào đăng nhập bằng chuột hoặc bấm phím Enter, như thế này:ExtJs bằng tay bắn sự kiện Click, nút param là khác nhau từ chuột nhấp

Ext.define('My.controller.Login', { 
    extend: 'Ext.app.Controller', 

    init: function(application) { 
     this.control({ 
      "#idLogin button": {click: this.onButton}, 
      "#idLogin form > *": {specialkey: this.onKey} 
     }); 
    }, 

    onButton: function(button, e, eOpts) { 
     var win = button.up('window'); // the login window 
     //do more stuff... 
    }, 

    onKey: function (field, el) { 
     if (el.getKey() == Ext.EventObject.ENTER) //ENTER key performs Login 
      Ext.getCmp('#idLogin button').fireEvent('click'); 
    } 
}); 

tôi nhận ra khi tôi sử dụng chuột để nhấp vào nút Đăng nhập, chức năng onButton hoạt động bình thường, button.up() trả về cho tôi Đăng nhập window.

Tuy nhiên, nếu tôi ép phím Enter và bắn các onKey chức năng để làm fireEvent('click'), trong trường hợp này onButton cháy lên nhưng tham số button KHÔNG giống như các tham số button nhận khi bạn nhấp chuột! Và lần này, hàm button.up() không xác định.

Câu hỏi là, tại sao fireEvent('click') cho tôi thông số nút khác?

Trả lời

14

Bạn phải sử dụng fireEvent chức năng như thế:

var myBtn = Ext.getCmp('#idLogin button'); 

myBtn.fireEvent('click', myBtn); 

Hãy thử.

+1

Cảm ơn bạn: D phát hiện và rất nhanh @! – Tom

+0

Bạn được hoan nghênh, hãy chấp nhận. – Patrick

+0

tại sao không có 'button.click()'? – Geo

7

Vì sự kiện nhấp nút là sự kiện tổng hợp được kích hoạt bởi khung. Nó đi dọc theo thể hiện nút và một đối tượng sự kiện. fireEvent có nghĩa là "thông báo cho bất kỳ người đăng ký nào rằng sự kiện này đã xảy ra, với các đối số", không "kích hoạt sự kiện nhấp chuột vào nút cơ bản".

Vì vậy, bạn sẽ cần phải sử dụng:

button.fireEvent('click', button);

Tuy nhiên, điều này không thực sự có ý nghĩa, bạn chỉ cần thêm một lớp về mình.

Tại sao không trừu tượng nó ra:

Ext.define('My.controller.Login', { 
    extend: 'Ext.app.Controller', 

    init: function(application) { 
     this.control({ 
      "#idLogin button": {click: this.onButton}, 
      "#idLogin form > *": {specialkey: this.onKey} 
     }); 
    }, 

    onButton: function(button, e, eOpts) { 
     this.doWindowFoo(); 
    }, 

    onKey: function (field, el) { 
     if (el.getKey() == Ext.EventObject.ENTER) //ENTER key performs Login 
      this.doWindowFoo(); 
    }, 

    doWindowFoo: function() { 
     // Assumes the window has an id idLogin, there are several other ways to get a reference 
     var win = Ext.getCmp('idLogin'); 
    } 
}); 
+0

Cảm ơn bạn rất nhiều vì đã trả lời chi tiết! Người Ấn Độ đánh bại nó bằng 60 giây với một đoạn ngắn XD – Tom

+1

Câu trả lời là "sai", bạn không nên kích hoạt một sự kiện trên nút. Nó không phải là cách chính xác để làm điều đó. –

+0

EvanT, nó không phải là tốt đẹp để lấy 'chấp nhận' trở lại từ anh ta XD nhưng tôi đồng ý bạn đã đi sâu hơn vào cơ cấu lại các chức năng trong thực hành tốt nhất. Bạn đã san bằng các lớp. Tôi ước tôi có thể tặng cho bạn hơn 10 cổ vũ! ~ – Tom

3

Sử dụng:

var button= Ext.getCmp('#idLogin button');  
button.fireHandler(); 
+0

"fireHandler" là một chức năng riêng tư và không nên dựa vào: http://docs.sencha.com/extjs/4.2.2/#!/api/Ext.button.Button-method-fireHandler – BillyTom

0

Một cách tổng quát hơn:

document.querySelector("what-ever-el-selector").click(); 

Thử nghiệm trên ExtJS 4.2.6

Cheers

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