Как отменить привязку обратного вызова выборки Backbone Collection?

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

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

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 позже (после «очистки» представления).

Я пробовал:

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

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


person jaketrent    schedule 08.02.2012    source источник


Ответы (1)


Вы всегда можете просто добавить логический флаг к 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
  }
});
person Skylar Anderson    schedule 09.02.2012
comment
Справедливо. Это имеет смысл. Было бы лучше не хранить дополнительное состояние и просто отвязать обратные вызовы успеха и ошибки от параметров выборки. - person jaketrent; 09.02.2012