Ответ 1
общие рекомендации заключаются в том, что каждый раз, когда у вас есть объект, который создается и уничтожается на протяжении всего срока службы приложения, и этот объект должен связываться с событиями из какого-либо другого объекта, вы должны использовать EventBinder
.
Виды и утечки памяти
Представления - прекрасный пример этого. Виды создаются и уничтожаются все время. Они также привязываются к множеству разных событий из model
и collection
в представлении. Когда представление уничтожается, эти события необходимо очистить. Используя встроенный метод bindTo
в представлении, обработчики событий будут очищены для вас. Если вы не используете bindTo
и вместо этого используете on
напрямую, вам придется вручную вызвать off
, чтобы развязать события, когда представление закрыто/уничтожено. Если вы этого не сделаете, у вас появятся зомби (утечки памяти).
Если вы еще не прочитали их, ознакомьтесь с этими статьями:
http://lostechies.com/derickbailey/2012/03/19/backbone-js-and-javascript-garbage-collection/
Пользовательские группировки событий
Представления - это не единственное место, где это применимо, но не единственный вариант использования для EventBinder
.
Если вы работаете с несколькими объектами, привязаны к их событиям, и эти объекты могут быть заменены другими экземплярами объектов, тогда полезно использовать EventBinder
. В этом случае подумайте о EventBinder как о коллекции или группе событий для связанных объектов.
Скажем, у вас есть ObjA, ObjB и ObjC. Каждый из них вызывает некоторые события, и вы хотите, чтобы вы очистили обработчики событий, когда ваш код будет выполнен. Это легко сделать с помощью EventBinder
:
doStuff = {
start: function(a, b, c){
this.events = new Marionette.EventBinder();
this.events.bindTo(a, "foo", this.doSomething, this);
this.events.bindTo(b, "bar", this.anotherThing, this);
this.events.bindTo(c, "baz", this.whatever, this);
},
doSomething: function(){ /* ... */ },
anotherThing: function(){ /* ... */ },
whatever: function(){ /* ... */ },
stop: function(){
this.events.unbindAll();
}
}
doStuff.start(ObjA, ObjB, ObjC);
// ... some time later in the code, stop it
doStuff.stop();
Вызов stop
в этом коде будет правильно очищать все обработчики событий для этого использования.
Когда использовать on
/off
Непосредственно
Обращаясь ко всему этому, нужно сказать, что вам не всегда нужно использовать EventBinder
. Вы можете уйти без него, всегда. Но вам нужно помнить, когда нужно, чтобы очистить ваши события.
В ситуациях, когда обработчики событий не нуждаются в очистке, нет необходимости использовать EventBinder
. Это может быть событие, которое запускает роутер или запускает объект Marionette.Application
. Для этих событий жизненного цикла приложения или событий, которые необходимо прожить на протяжении всей жизни приложения, не беспокойтесь с помощью EventBinder
. Вместо этого просто включите обработчики событий. Когда человек обновит окно браузера или перейдет на другой сайт, обработчики будут очищены в этой точке.
Но когда вам нужно управлять своими памятью и обработчиками событий, очищая ссылки и закрывая их, не обновляя страницу или не перемещаясь от нее, тогда EventBinder
становится важным, поскольку это упрощает управление событиями.