2014-02-24 9 views
1

사용자가 jQuery ajax 호출로 여러 부분 뷰를 div에 추가 할 수있는 ASP MVC 응용 프로그램이 있습니다.로컬 성공 이벤트 전의 글로벌 ajaxSuccess 이벤트

jQuery("#AddNew").click(function() { 
    $.ajax({ 
     url: this.href, 
     cache: false, 
     success: function (html) { 
      jQuery("#DivId").append(html); 
     } 
    }); 
    return false; 
}); 

문제는 사용자가 사용자의 세션이 시간 초과 한 부분 뷰를 반환 조치, 승인해야하기 때문에, 그 대신 부분보기의 로그인 페이지를 렌더링하고 있다는 점이다. 나는 비슷한 아약스 호출을 사용하여 여러 장소를 가지고, 그래서 글로벌 ajaxSuccess 이벤트로 다음과 같은 추가 :

jQuery(document).ajaxSuccess(function (event, request, settings) { 
    var isLogin = jQuery(request.responseText).find('.login-form').length; 
    if (isLogin > 0) { 
     var url = document.URL; 
     var rootPath = '@Request.Url.GetLeftPart(UriPartial.Authority)'; 
     var path = url.replace(rootPath, ''); 
     var pathEncoded = encodeURIComponent(path); 
     var loginURL = rootPath + "/Account/Login?returnUrl=" + pathEncoded; 
     location.href = loginURL; 
    } 
}); 

권한이없는 아약스 요청이 때 로그인 페이지로 사용자를 리디렉션하므로이, 작동합니다. 그러나 리디렉션 전에 짧은 시간 동안 표시되는 div에 html이 추가됩니다.

글로벌 이벤트가 로컬 이벤트 전에 트리거되도록하는 방법이 있습니까? jQuery API은 글로벌 성공 이벤트가 글로벌 ajaxSuccess 이벤트보다 먼저 발생했음을 보여 주므로 성공보다는 완료를 사용하도록 아약스 호출을 변경하려고 시도했습니다. 이것은 효과가 있지만 성공을 위해서만 실행되는 코드를 추가해야 할 필요가있는 것처럼 보입니다. 동일한 문제가 발생합니다. 이 문제를 해결할 더 좋은 방법이 있습니까?

답변

1

원하는 기능 (특히 작업 순서)을 보장하는 ajax 메서드를 래핑하는 API를 직접 작성하는 것이 좋습니다. 여기에 매우 이상 - 단순화 된 예는 다음과 같습니다

var async = function(props) { 
    var finished = $.Deferred(); 
    $.ajax(props) 
    .done(function(response) { 
     // detect auth timeout, handle consisently 
     if(response.isAuthTimeout) { 
     // render login ui 
     finished.reject('auth-timeout'); 
     } else { 
     finished.resolve.apply(finished, arguments); 
     } 
    }) 
    .fail(function() { 
     finished.reject.apply(finished, arguments); 
    }) 
    return finished; 
}; 

그런 다음, 실제로는 오히려 기본 $.ajax API보다 (당신이 당신의 래퍼를 호출하기로 결정 어떤 이상) async에 통화를 할 수 있습니다.

의미가 있습니까?

+0

또한 여기에 추가 된 이점은 auth-timeout이 실제로 연관된 약속을 거부하게되는 것입니다. 실제 HTTP 요청이 성공하더라도 기다려야합니다. API 당 실제로는 실패입니다! – Skone

+0

그래, 그건 이해가된다. 그리고 그것은 이것을 다루는 더 좋은 방법 인 것처럼 보인다. 이 애플리케이션에서는 거대한 문제는 아니며, 적어도 (현재는 최소한) 기본 Ajax 기능 이외의 것을 사용하도록 변경하는 대신 리디렉션하기 전에 약간의 표시를 허용한다고 생각합니다. – michael