Как отменить привязку обратного вызова извлечения Backbone Collection? - PullRequest
0 голосов
/ 09 февраля 2012

Если у меня есть представление, у которого есть коллекция, которая извлекается в функции инициализации, но представление необходимо очистить до того, как выборка вернется, как мне отменить привязку обратных вызовов, вызвавших успех и / или ошибку?

Итак, с таким кодом:

Backbone.View.extend({
  initialize: function () {
    this.collection = new MyColl();
    this.collection.fetch({
      success: this.successCallback,
      error: this.errorCallback
    });
  },
  close: function () {
    // what goes here to keep successCallback and errorCallback from being called?
  }
});

Когда я вызываю myView.close (), чтобы очистить его (в данном случае, чтобы показать другое представление), и я не хочу вызывать successCallback позже (после представления "cleanup").

Я пробовал:

close: function () {
  this.collection.unbind('reset');
}

Но в коллекции, похоже, нет события this, перечисленного во внутренней переменной _callbacks после выборки, поэтому unbind, похоже, не поможет.

1 Ответ

1 голос
/ 09 февраля 2012

Вы всегда можете просто добавить логический флаг в this.successCallback и this.errorCallback, который проверяет, был ли вызван this.close:

Backbone.View.extend({
  initialize: function () {
    this.collection = new MyColl();
    this.collection.fetch({
      success: this.successCallback,
      error: this.errorCallback
    });
  },
  close: function () {
     // do stuff
     this.closed = true;
  },
  successCallback: function() {
    if(this.closed) return;
    //Do stuff
  }
});

Кроме того, вы не должны настраивать свои события таким образом. Гораздо больше «опоры», если вы вместо этого делаете что-то похожее на:

Backbone.View.extend({
  initialize: function () {
    this.collection = new MyColl();
    this.collection.bind('reset', this.SuccessCallback);
    this.collection.bind('error', this.errorCallback);
  },
  close: function () {
     // do stuff
     this.collection.unbind('reset', this.successCallback);
     this.collection.unbind('error', this.errorCallback);
  },
  successCallback: function() {
    //Do stuff
  }
});
...