2016-11-01 7 views
0

내 코드가 작동하지만 html로 호출해도 작동하지 않는다면 이해가되지 않습니다. 나는 HTML에서 호출하는 경우 그것은 나에게 오류 잡히지 않은 TypeError : Request.callPost가 함수가 아닙니다.

Uncaught TypeError: Request.call Post is not a function

이유

을 제공?

<button onclick="Request.callPost('/Api/Page/start/','mypost')" >My button</button> 
<br> <br><br> 
(function($){ 
$(document).ready(function(){ 

    var Request={ 
     init:function(){ 

      this.callPost('/Api/Page/all','data'); //ok it work 
     }, 
     callPost:function(link,data){ 
      $.ajax({ 
       url:link, 
       type:'POST', 
       data:data, 
       dataType:'json', 
       success:function(response){ 
        console.log(response); 
        return response; 
       } 
      }); 
     }, 
     callGet:function(link,data){ 
      $.ajax({ 
       url:link, 
       type:'GET', 
       data:data, 
       dataType:'json', 
       success:function(response){ 
        return response; 
       } 
      }); 
     }, 
    } 

    Request.init(); 
}) 
})(jQuery); 

답변

0

단순화하기 위해이 코드는 다음과 같이 구성되어있다 : 그것은 전역에 존재하지 않기 때문에

(function($){ 
    $(document).ready(function(){ 

     var Request = 'something'; 

    }); 
})(jQuery); 

// trying to use 'Request' here 

당신은 전역 범위에서 Request을 사용할 수 없습니다. ready() 함수로 전달 된 function에만 존재하며 다른 익명 함수 내에서 발생합니다. 이 함수 밖의 변수는 변수를 볼 수 없습니다. 당신이 필요 당신의 변수는 전역 범위에 존재하는 경우

, 당신은 거기를 선언 할 수 있습니다 : 당신은 일반적으로 단지 전역에 모든 이동하고자하지 않는

var Request; 

(function($){ 
    $(document).ready(function(){ 

     Request = 'something'; 

    }); 
})(jQuery); 

// you can use 'Request' here 

이 방법과주의 모든 오류가 발생한 시간. 이것은 이 아니고에 익숙해지기를 원하는 황금 망치입니다. Request이 전역 범위에 있어야하는 경우이 트릭을 수행합니다.

대신 을 사용할 수있는 범위 내에서 클릭 핸들러를 부착하는 것이 좋습니다.. 이런 식으로 뭔가 :

(function($){ 
    $(document).ready(function(){ 

     var Request = /.../; 

     $('#yourButton').click(Request.callPost('/Api/Page/start/','mypost')); 

    }); 
})(jQuery); 

// no need to use 'Request' here 

는 의미를해야이 문제의 요청을 받고 있는지 외부 코드의 구조를 기반으로 만들어야 할 것 아마 일부 변경,하지만이 경우 원칙이 있습니다. 전역 범위 (귀하의 경우에는 HTML 인라인 핸들러)에 코드를 사용하는 대신 좁은 범위의 코드에 액세스하고 범위를 좁히고 범위를 좁힌 코드를 전역 범위의 개체에 액세스 시키십시오 (경우에 따라 HTML 요소) . 코드의 복잡성이 증가하고 테스트 용이성이 더 중요 해짐에 따라

, 당신은 전역 객체 완전히 추상화 할 것입니다 및 은 좁은 범위의 코드에에게 그것을 제공하기보다는 좁은 범위의 코드 내에서 그것을 추구합니다. 그러나 우리는 그런 종류의 일을하는 데 몇 시간을 할애 할 수 있습니다. 그리고 나는 그것이 여기서 물어 보는 바깥에 있다고 생각합니다.

기본적으로 좁은 범위의 항목에 액세스하려고합니다. 그리고 즉각적인 솔루션은 더 큰 범위로 뭔가를 넣어 또는 당신이 처음에 액세스 할 필요가 없습니다 있도록 코드를 구조화하고 방법을 변경하기 위해이 될 것입니다. 전자는 보여주고있는 코드에 대한 더 빠른 접근법이며 후자는 더 깨끗합니다.

관련 문제