2012-01-26 2 views
1

아래 코드 블록에서 remoteAPIObj에 대한 initialize1initialize2 호출이 모두 내 렌더링을 렌더링하기 전에 완료되었는지 확인해야합니다. 두 함수 모두 AJAX 쿼리를 수행하고 주어진 콜백 함수를 실행합니다.Backbone.js는 렌더링하기 전에 콜백 할 때까지 대기합니다.

그래서 다른 함수 renderOnce을 정의하고 underscore.js 함수 after을 사용하여 실제로 실행되기 전에 renderOnce이 실제로 2 번 호출되었는지 확인합니다. 이 접근법에 빠진 것이 있습니까? 아니면 다른 제안이 있습니까?

window.MyView = Backbone.View.extend({ 
    el: $('#right-container'), 
    render: function(eventName) { 
     var template = Handlebars.compile($("#right-template").html()); 
     $(this.el).html(template(remoteAPIObj.getData())); 

     return this; 
    }, 
    initialize: _.once(function() { 
     var self = this; 
     remoteAPIObj.initialize1(function(){self.renderOnce();}); 
     remoteAPIObj.initialize2(function(){self.renderOnce();}); 
    }), 
    renderOnce: _.after(2, function() { 
     this.render(); 
    }) 
}); 

답변

1

JQuery와 함께 할 수있는 이상적인 방법은 접근 약속 - http://api.jquery.com/jQuery.when/

예 : 내부 코드가 약속에 적용 할 수있는 경우

$.when($.ajax("test.aspx")).then(function(ajaxArgs){ 
    alert(ajaxArgs[1]); /* ajaxArgs is [ "success", statusText, jqXHR ] */ 
}); 

것은,이

과 같은 작업을 수행 할 수 있습니다
$.when(remoteAPIObj.initialize1, remoteAPIObj.initialize2).then(function(args1, args2){ 
    this.render(); 
}); 

오류가 발생하면 이벤트 시스템을 사용하여 렌더링 메서드에 데이터를 사용할 수 있음을 알리는 이벤트입니다. 그러나 이것은 당신이 이미하고있는 것과는 크게 다르지 않을 것입니다.

+0

나는 $ .when가 initialize1과 2의 콜백 모두가 실행될 때까지 기다리지 않을 것이라고 생각한다. 그래서 나는 그것들을 작동시키기 위해 동기식으로 동작시켜야 할 것이다. – osoner

+0

만약에 그것을 지연 객체로 만들면 나는 귀엽다. 둘 다 기다려야합니다. 몇 가지 테스트 아약스 코드로 시험해보기에 충분하다. – JohnP

+0

initialize1과 initialize2에서 return $ .ajax ({...})를 사용하면 $가 실제로 만들어집니다. – osoner

관련 문제