2010-08-06 11 views
3

내 첫 번째 JQTouch 응용 프로그램 작성. #login에서 #home으로 이동하면 JSON ajax 호출이 성공적으로 수행되지만 pageAnimationEnded 이벤트는 무한 루프에있는 것으로 보입니다. AJAX로 전환 JQuery와 가로 채서jquery/jqtouch getJSON을 호출하면 무한 루프가 발생합니까?

 $(function(){ 

      $('#login').ajaxComplete(function (e, xhr, settings) {     
       jQT.goTo('#home', 'flip'); 
      }); 

      $('#home').bind('pageAnimationEnd', function(e, info){ 

       alert('animation ended'); //infinite loop happens in here 

       $.getJSON('/test', function(data) { 
        alert('json: ' + data); //this returns data successfully 
       }); 

      }); 

     }); 

로그인 POST 전화 :

<div id="login" class="current"> 
     <div class="toolbar"> 
      <h1>testapp</h1> 
      <a class="button slideup" id="infoButton" href="#about">About</a> 
     </div> 
     <form:form commandName="user" action="/login/authenticate"> 
      <ul class="edit rounded"> 
       <li><form:input path="email"/></li> 
       <li><form:password path="password" /></li>      
       <li>Remember Me<span class="toggle"><input type="checkbox" /></span></li>      
      </ul> 
      <a style="margin:0 10px;color:rgba(0,0,0,.9)" href="" class="submit whiteButton">Login</a> 
     </form:form> 
    </div> 

어떤 힌트

을 감상 할 수있다, 사전에 감사합니다! :-)

UPDATE

은 분명히 .ajaxComplete뿐만 아니라 다른 요소에 대한 이벤트를 받으면에.

  $(document).ready(function(e){ 
       alert('document ready'); 

       $('#login').ajaxComplete(function (e, xhr, settings) {  

        if(settings.url == '/login/authenticate') { //add check to prevent infinite loop 
         alert('jqt goto ' + settings.url);   
         jQT.goTo('#home', 'flip'); 
        } 
      }); 

      $('#home').bind('pageAnimationEnd', function(e, info){ 

       alert('animation ended'); 

       $.getJSON('/test', function(data) { 
        alert('json: ' + data); 
       }); 

      }); 
     }); 
+0

필자는 이것이 다소 우회적 인 해결책이라고 생각합니다. 다시 말하지만, 아래에서 언급했듯이, 나는 아약스 전체 호출 (모든 아약스 호출에서 호출되기 때문에 성능 문제가있을 경우)을 피하고 초기 #login 아약스 호출에 콜백을 제공한다. – brad

답변

2

야이 확실히 무한 루프가 발생합니다. 초기 pageAnimationEnd이 어떻게 든 발생한다고 가정하면 다음을 수행합니다.

애니메이션이 종료되므로 바인딩 메소드가 ajax 호출을 수행합니다. 그 ajax 호출은 "집에 가라"라는 완료 ajaxComplete()에 등록 된 콜백을 가지고 있습니다. 이것은 집으로 돌아가서 일종의 애니메이션을 완성합니다. 그러면 완성 된 아약스 콜이 트리거됩니다. 아약스 호출에는 "집에 가십시오"라는 완료시 ajaxComplete() 콜백이 등록되어 있습니다.

당신이 원하는 것은 모든 Ajax 요청에 대해 호출되는 일반 ajaxComplete()이 아니지만 단일 호출을 수행하는 로그인 코드의 특정 호출입니다. 나는 당신이 무엇을 성취하려고하는지 정확히 알지 못하기 때문에 문제에 대한 해결책을 제시하기가 어렵습니다. 이것은 모든 것을 정확하게 이해할 수있을지라도 문제에 대한 충분한 설명이되어야합니다.

+0

Brad에게 감사드립니다. 그래, 네 말이 맞아. 조건부 로직을 추가했는데, 이것이 앞으로 더 많은 플로우를 처리 할 수있는 확장 가능한 방법인지 확신 할 수 없습니다. 특정 요소에 대해서만 실행되는 .ajaxComplete가 있습니까? JQTouch 내의 각 요소에 대한 특정 처리기를 갖고 싶습니다. – Mark

+0

jqTouch에 익숙하지 않습니다. 또한 로그인 아약스 호출이 이루어지는 곳을 이해하는 데 어려움을 겪고 있습니다. 더 많은 코드를 게시 할 수 있습니까? – brad

+0

죄송합니다. 간단하게 남겨 두었습니다. 방금 페이지를 업데이트했습니다. 표준 양식 인 POST이지만 jquery는이를 가로 채고 AJAX 호출을합니다. – Mark

1

나는 JQuery와 매우 잘 모르겠지만 난 당신이 루프를 방지하기 위해 $(selector).one(function(){...}를 사용할 수 있다고 생각 : 내가 원하는 이벤트를 필터링 할 경비를 추가했습니다.

http://api.jquery.com/one/

관련 문제