2014-11-13 4 views
1

업데이트 : 도움을 받아 문제를 추적 할 수있었습니다. 함수 참조를 위해 뭔가를하는 것은 if (! 액션)입니다. 일단 '!'을 제거하면 효과가있었습니다. 처음에 참조가 있는지 확인하고 싶었 기 때문에 버그였습니다. 내 새로운 질문은 그게 무엇입니까! 연산자가 true로 평가 한 다음 함수가 실패하게하는 참조를 변경하게하는 함수를 호출합니다 (이 경우 디버거에서 오류가 감지되지 않았습니다). 원래JQuery 이벤트에서 JS 객체가 콜백되지 않습니다.

는 : 나는 몇 가지 변수를 캡슐화하고, JQuery와 UI 대화 버튼을 클릭 할 때 콜백을 수행하는 자바 스크립트 함수를 만들었습니다. 다음은 함수의 자바 스크립트입니다.

function LoginControl(parentDiv, usernameInput, passwordInput, action) 
{ 
    var that = this; 
    var container = parentDiv; 
    var user = usernameInput; 
    var password = passwordInput; 
    var actions = action; 

    that.init = function() 
    { 
     container.dialog(
      { 
       modal:true, 
       show:false, 
       buttons: {"Login":Login, Cancel:Close } 
      } 
     ); 
    }; 

    var Login = function (evt) { 
     if (!actions) 
      actions(); 
    }; 

    var Close = function() 
    { 
     container.dialog("close"); 
     if(!actions) 
      actions(); 
    }; 

    that.show = function(evt) 
    { 
     container.dialog("open"); 
    }; 
} 

문제는 actions/함수를 실행하는 로그인/닫기 함수에 있습니다. 그것이 실행될 때, 디버거가 나에게 "이 객체가 정확하지 않기 때문에 [LenientThis]가있는 속성을 가져 오거나 설정을 무시합니다."라는 경고 메시지를 보냅니다. " 함수가 실행되지 않습니다. 다음은 HTML입니다 (외부 jquery 소스 파일은 생략했지만 JQuery 2.0.3 및 JQuery UI 1.1.3을 사용하고 있습니다.이 문제를 해결할 수는 없지만 방해가되었습니다.) "call", " 바인딩 "및"아무 소용 "방법을 적용 할 수 있습니다. 도움을 알려 주시기 바랍니다. 감사합니다!

<html> 
<head lang="en"> 
    <script type="text/javascript"> 
     function onAction() 
     { 
      alert("Hello!"); 
     } 

     $(document).ready(function() { 
      var loginCtrl = new LoginControl($("#login"), $("#username"), $("#pass"), onAction); 

      loginCtrl.init(); 
      loginCtrl.show(); 
     }); 
    </script> 
</head> 
<body> 
<div id="login"> 
    <form> 
     <label for="username">User Name:</label> <input type="text" id="username" /><br> 
     <label for="pass">Password:</label><input type="password" id="pass" /> 
    </form> 
</div> 
</body> 
</html> 

답변

0
당신은 Login을 변경해야

Closethat.Login =that.Close =을. 그들은 현재 볼 수없는 기능 내부 변수이다 또한 변경하십시오. buttons: {"Login":Login, Cancel:Close }에서 buttons: {"Login":that.Login, Cancel:that.Close }

+0

같은 결과가 나타납니다. 디버거에서 actions 변수를 검사했을 때, 이온. 시계가 실행되면 시계는 반환 값이 정의되지 않았 음을 나타내며, 변경 제안 전에 이미 수행 중입니다. 호기심으로, 나는 LoginControl 함수 내에서 onAction 함수를 생성하기로 결정하고 actions 변수 대신에 이것을 호출했습니다. 그것은 벌금을 부과했다. 하지만 init에서 onAction 함수에 액션을 할당하면 다시 사각형으로 돌아갑니다. 이 시점에서 나는 그것의 범위 문제라고 생각하지만, 나는 그것을 바로 잡는 방법을 놓쳤습니다. – stn9000

+0

추가하는 것을 잊어 버렸습니다.'var actions = action;'을'that.actions = action'으로 변경하고 action을'that.actions();'로 호출해야합니다. 대답의 변화와 함께 이것들을 시도해 볼 수 있습니까? – artm

+0

나는 당신이 제안한 수정안을 만들었지 만 그 결과는 똑같다. – stn9000