2011-10-19 6 views
0

메신저를 오해하는 기능 범위 내 기능 :JS & EXT JS : 다음 코드 몇 가지 문제가

내가하지만 'enviarLogin'내부 'crearLoginWindow'함수를 호출 할 수 있도록하려면
Ext.define('...controller...', { 
extend: 'Ext.app.Controller', 

init: function() { 
    ... 
}, 

crearLoginWindow:function(){ 

    var loginWindow = Ext.create('Proto1.view.adminbd.LoginWindowBDView', { 
     itemId: 'loginwindow', 
     autoShow: true, 
     modal: true 
    }); 

    Ext.ComponentQuery.query('#loginwindow > button[text="Cancelar"]')[0].on('click', function(){loginWindow.close()}); 

    //Cant call 'enviarLogin' function if its inside 'crearLoginWindow' 
    Ext.ComponentQuery.query('#loginwindow > button[text="Conectar"]')[0].on('click', this.enviarLogin, this); 

    var enviarLogin = function(){ 
     console.log('login') 
    } 

} 

}); 

그것은 참조를 던졌습니다 오류. 함수가 'crearLoginWindow'외부에 있으면 작동 할 것입니다.

이 두 라인 문제의 근원 인 : 나는 다른 범위를 시도했습니다

Ext.ComponentQuery.query('#loginwindow > button[text="Conectar"]')[0].on('click', this.enviarLogin, this); 

var enviarLogin = function(){ 
    console.log('login') 
} 

하는 등의 변형;

Ext.ComponentQuery.query('#loginwindow > button[text="Conectar"]')[0].on('click', this.crearLoginWindow.enviarLogin); 
this.enviarLogin = function(){ 
    console.log('login') 
} 

범위와 기능을 실행하기 위해 상주하는 위치를 지정해야한다는 필요성에 대해 이해할 수 있습니다.

이 문제는 내 코드가 매우 어수선하기 때문에 해결할 수 있습니다.

답변

1

단순히 다른 함수 내에서 함수를 정의해도 객체 나 인스턴스에 연결되지 않으므로 this.enviarLogin이 작동하지 않습니다. 두 가지 기본 옵션이 여기에 있습니다 :

  1. 당신이 (당신의 핸들러를 할당 위에 그것을 이동)하고있는대로 그냥 내부 함수를 정의하고 이름으로 직접 참조 :

    var enviarLogin = function(){ 
        console.log('login') 
    }; 
    
    Ext.ComponentQuery.query('#loginwindow > button[text="Conectar"]')[0] 
        .on('click', enviarLogin); 
    
  2. 정의 enviarLogin 방법, 당신이 crearLoginWindow를 정의하는 방법과 동일 :

    Ext.define('...controller...', { 
        extend: 'Ext.app.Controller', 
    
        init: function() { ... }, 
    
        crearLoginWindow: function(){ 
         // ... 
    
         Ext.ComponentQuery.query('#loginwindow > button[text="Conectar"]')[0] 
          .on('click', this.enviarLogin, this); 
        }, 
    
        enviarLogin: function(){ 
         console.log('login') 
        } 
    
    }); 
    

메서드 외부에서 enviarLogin을 참조 할 필요가없는 경우 첫 번째 버전이 더 좋을 수 있습니다. 다른 곳에서 enviarLogin을 참조해야하는 경우 두 번째 방법이 더 좋으며 enviarLogin에서 this을 더 명확하게 사용하십시오.

+0

감사합니다. 아래에 함수를 넣는 간단한 방법이 없다면 옵션 1이 내 코드를이 문제에 대해 명확하게 유지하는 가장 좋은 해결책 인 것 같습니다. – vto

+0

함수 표현식 대신 함수 선언을 사용하면 아래 함수 정의와 함께 옵션 1을 사용할 수 있습니다 :'function enviarLogin() {...}'- [관련 질문] (http://stackoverflow.com/) 질문/336859/javascript-var-functionname-function-vs-function-functionname) – nrabinowitz

+0

좋아, 내가 원하는 모든 '도우미'를 넣을 수 있고 또한 '하위 기능'이 '함수 컨테이너'. – vto