2016-11-11 6 views
1

난 당신이 후백본 -보기

사이를 전환 할 수 있습니다 파단 아약스 호출이 기본보기에 '성공'DIV, 성공적으로 가져가있는 상자가있는 기본보기가 제거 된 후 지연된 실행을 방지 가 표시됩니다.

내가 직면하는 문제는 하위 뷰 사이를 전환하면 이전 뷰의 가져 오기에서 지연된 약속이 실행되고 'success'div가 표시된다는 것입니다.

var fetchXhr = this.model.fetch().done(function() { 
    $('#success').show(); 
}); 
onChangeSubview: function() { 
    fetchXhr.abort(); 
} 

을 나는 몇 가지가 있습니다

this.model.fetch().done(function() { 
    $('#success').show(); 
}); 

onChangeSubview: function() { 
    this.subview.unbind(); 
    this.subview.remove(); 
} 

이 SO 질문 abort-ajax-requests-using-jquery 당신이이 연기에 포인터를 저장하고과 같이) (중단 호출하여 중지 할 수 있습니다 말한다 :

내 코드입니다 각 하위 뷰를 가져오고 일부는 일정 간격으로 반복됩니다. 즉, 모든 가져 오기 요청을 저장하고 각각에 중단을 호출하는 루프를 반복해야합니다.

지연된 함수가 실행되지 않도록하는 더 좋은 방법이 있습니까? 예 : 하위 뷰가 제거되었는지 확인하는 일종의 검사 또는 모든 지연 약속을 바인딩 해제하는 함수?

+1

큰 소리로 생각하면 목록에 하위보기에 대한 모든 가져 오기를 추가 한 다음 onChangeSubview를 반복하여 반복 할 수 있으며 예를 들어 중단을 실행할 수 있습니다. 'this.fetches.forEach (function (fetchXhr) {fetchXhr.abort();})''또는'_.invoke (this.fetches, 'abort');'당신이 밑줄 방식으로하고 싶다면). 잠재적으로이 기능을 확장하여 기본 뷰에 배치 할 수도 있으므로 일부를 추상화 할 수 있습니다. – Dymos

+1

@Dymos +1. 당신은 너무 겸손합니다. 그것은 논평이 아니라 실제 답변입니다.) – hashchange

+0

하하 감사합니다 :-) 나는 후손을위한 대답으로 그것을 추가 할 것입니다. – Dymos

답변

1

숨기기 (현재 바인딩 해제/제거 중임을 나타냄)하더라도보기가 계속 새로 고쳐 지길 원할 수 있으므로 중단은 반드시 바람직하지 않습니다.

'#success'요소가 조건부로 표시되는 패턴을 채택하여 중단해야하는 필요성을 확실히 피할 수 있습니다. 예 : $('#success') 개체를 #success 요소 만 표시하는 함수를 반환하는 메서드로 리깅하여 특정 하위 뷰 (또는 해당 컨테이너)가 표시됩니다 (또는 어떤 기준이 적합하든). 모든 페치 장소에서 그 패턴으로

// in some suitable outer context 
var $success = $('#success'); 
$success.showConditional = function($container) { 
    var $self = $(this); 
    return function() { 
     if($container.is(':visible')) { 
      $self.show(); 
     } 
    } 
}; 

... 

$subviewContainer = $("someSelector"); //or maybe the container is already a property of this or this.model? 
this.model.fetch().done($success.showConditional($subviewContainer)); 

#success 요소는 숨겨진 또는 제거 파단 게재되지 않습니다.

어쨌든 원리입니다. 전체 패턴에 맞게 세부 사항을 조정해야 할 수도 있습니다.

+0

같은 것을 생각하고 있지만 제거 된 객체를 테스트하는 방법을 알지 못했습니다. 당신은 그 viewed의 cache'd jquery 엘리먼트에 대한 DOM 검사에 대해 생각하고있다. 그러나 나는 계산 상 비싸다 고 생각했기 때문에 대신 다음과 같이했다. 부모 뷰는 현재 이.sub.subss.cleanup()을 호출한다. ; 하위 뷰를 제거 할 때 하위 뷰의 정리 함수에서 "removed"필드를 추가하고 설정했습니다. 정리 : function() { this.removed = true; this.remove(); this.unbind(); } 그리고 ajax 호출에서 나는 체크를했습니다 : this.model.fetch(). 항상 (if (!! self.removed) {return;} -code-); – Ta946

+1

멋지다. 당신은'.cleanup()'을'.remove()'에서'true '를 반환함으로써 구문 적으로 더 깔끔하게 만들 수 있으며,'this.removed = this.remove()'를 쓸 수 있습니다. 사실,'this.remove()'가 때때로 실패 (즉, 제거되지 않음) 할 수있는 경우 유용합니다 (이 경우 try/catch를 사용하면'false'를 반환 할 수 있습니다). –

1

이 문제를 해결하는 한 가지 방법은 하위 뷰에 대한 모든 가져 오기를 목록에 추가 한 다음 onChangeSubview을 반복하고 중단을 실행하는 것입니다.

this.fetches.forEach(function(fetchXhr) { 
    fetchXhr.abort(); 
}); 

또는 당신이 그것을 당신은 잠재적으로 당신이 그렇게하면 그 중 일부 수 추상적 멀리 확장 기본보기에이 기능을 넣을 수있는 밑줄 방법

_.invoke(this.fetches, 'abort'); 

을 수행하려는 경우.

+0

OP가 추구하는 "더 좋은 방법"인가, 그가 이미 알고있는 방식입니까? –

+0

그것은 다른 방법입니다 :) - 그것이 가져 오는 가치는 보는 사람의 눈에 있습니다 – Dymos