Backbone - 在删除视图后阻止延迟执行

时间:2016-11-11 10:06:25

标签: javascript jquery backbone.js promise deferred

我有一个主视图,其中包含一个可以在

之间切换的子视图

获取ajax调用成功后,将显示主视图上的“成功”div。

我面临的问题是,当我在子视图之间切换时,前一个视图的提取中的延迟保证仍会被执行并显示“成功”div。

这是我的代码:

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

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

这个问题abort-ajax-requests-using-jquery说你可以存储指向延迟的指针并通过调用abort()来阻止它:

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

我为每个子视图提取了几个提取,有些在一个时间间隔内重复,这意味着我必须存储每个获取请求并通过它们循环调用每个子视图中止。

有没有更好的方法来阻止执行延迟函数? 例如:某种检查是否已删除子视图,还是解除所有延期承诺的绑定功能?

2 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是将子视图的所有提取添加到列表中,然后onChangeSubview迭代它们并执行中止,例如

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

或者如果你想以Underscore的方式进行

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

您甚至可以将此功能放在您扩展的基本视图中,这样您就可以将其中的一部分抽象出来。

答案 1 :(得分:1)

中止并不一定是可取的,因为您可能希望视图即使在隐藏时也会继续刷新(确认您当前解除绑定/删除)。

你当然可以通过采用导致“成功”的模式来避免中止。要有条件地显示的元素,例如通过使用一种方法绑定#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

对于所有提取采用该模式,puppet-enterprise-2016.1.2-ubuntu-14.04-amd64.tar元素不会显示隐藏或已删除的子视图。

无论如何,这是原则。您可能需要调整细节以适合您的整体模式。