2016-11-11 10 views
1

は、私はあなたが後バックボーン - ビューが

を切り替えることができますサブビューAJAX呼び出しがメインビューに「成功」​​のdiv、成功するとフェッチを持っている箱を持っている主なビューを持って除去した後に遅延実行を防ぎます示されています。

私が直面している問題は、サブビュー間を切り替えると、以前のビューのフェッチの延期された約束がまだ実行され、「成功」divが表示されることです。

これは私のコードです:

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

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

このSOそうのような)abort-ajax-requests-using-jqueryはあなたが延期にポインタを格納し、(中止を呼び出すことによって、それを止めることができますと言う質問:

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

私はいくつかを持っていますそれぞれのサブビューをフェッチし、いくつかはある間隔で繰り返されます。つまり、すべてのフェッチ要求を格納し、それぞれの要求を中止する必要があります。

遅延機能が実行されないようにするには、より良い方法がありますか? 例:サブビューが削除されたかどうかを確認する何らかのチェック、またはすべての延期された約束をバインド解除する関数?

+1

大声で考えてみましょう。サブビューのすべてのフェッチをリストに追加してからonChangeSubviewを追加して、それらを反復処理して中止を実行できますか? 'this.fetches.forEach(function(fetchXhr){fetchXhr.abort();});'(または '_.invoke(this.fetches、 'abort');'アンダースコアのようにしたい場合)。この機能を潜在的にベースビューに配置して拡張することもできますので、その一部を抽象化することができます。 – Dymos

+1

@Dymos +1。あなたはあまりにも控えめですが、それはコメントではなく実際の答えです;) – hashchange

+0

haha​​ありがとう:-)私はそれを後世の答えとして追加します。 – 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

同じことを考えていましたが、削除されたオブジェクトをテストする方法はわかりませんでした。あなたは、ビューのcache'd jquery要素についてDOMをチェックする考えですが、私はそれが計算されたので、代わりに私は以下を行ったと心配していました: 親ビューは現在この.subviews.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

これを解決する1つの方法は、サブビューのすべてのフェッチをリストに追加してから、onChangeSubviewを反復処理して中断を実行することです。

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

またはあなたがそれをアンダースコアをしたい場合の方法

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

あなたは、潜在的にも、あなたがそうあなたが離れてそれのいくつか抽象的でし延長することを基本ビューでこの機能を入れることができます。

+0

OPが探している "良い方法"、または彼がすでに知っている方法ですか? –

+0

それは別の方法です:) - それがもたらす価値は見る人の目にあります – Dymos

関連する問題