2016-08-10 3 views
0

У меня есть родительский вид, который содержит, скажем, 400 видов детей. Если я зарегистрирую 2 события на просмотр, это будет 800 событий, для которых DOM будет отменять.Backbone Просмотр события или пузыри

Мой вопрос в том, должен ли я регистрировать события в дочернем представлении или использовать события пузырьков для захвата события на родительском уровне.

Что такое оптимизация и эффективность.

Заранее спасибо

+1

Измерение? Зачем спрашивать мнение, можете ли вы иметь факты. Или вы ожидаете, что кто-то другой выполнит эту работу? – Mjh

+0

@Mjh Я попросил второго мнения. Я хочу спросить, не повредит ли производительность сайта, если 400 детей имеют 400 событий или 400 детей имеют 1 событие на родительском уровне. –

+0

Измерение. Не просите второго мнения, если вы можете это увидеть сами. Не ленитесь. Кроме того, здесь нет проблем с программированием. –

ответ

1
<div id="parent"> 
    <div id="child1" class="child"/> 
    <div id="child2" class="child"/> 
    <div id="child3" class="child"/> 
    .... 
    .... 
    <div id="child400"/> 
</div> 

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

ParentView = Backbone.View.extend({ 
    el: "#parent", 

    events: { 
     "click .child": "clickEventHandler" 
    }, 

    clickEventHandler: function(event){ 
     //You can access child like this. 
     var $target = $(event.currentTarget); 
    } 
}); 
+0

привет @ user10 это именно моя точка. Я хочу спросить, что он оптимизировал и идеально подходит для этой ситуации. и еще одно, что я хотел бы добавить, как получить доступ к модели из детского представления ... –

+0

Это проще. Вы можете передать его во время инициализации вашего дочернего представления, и вы можете получить доступ в своем дочернем представлении, например this.options.paramName. Смотрите это http://stackoverflow.com/questions/7803138/backbone-js-how-to-pass-parameters-to-a-view – user10

1

Что вы ищете называется event delegation, и да, это хорошо масштабируется, в то время как подключить нагрузку слушателей к отдельным элементам этого не делает. По моему опыту, вы занимаете худшую часть производительности при настройке обработчиков.

Another answer on SO также относится к последствиям производительности и ссылки на this test on jsPerf (в настоящее время недоступно, поскольку jsPerf закрыт для капитального ремонта).

Возможно, более полезными являются эти две демонстрации: создание 1000 элементов с помощью базовой линии, один раз with event delegation, в другой раз without.

Как видно из демонстрации, влияние значимо. В демонстрации установлены три события: mousedown, mouseup, click - и время для создания страницы примерно удваивается в демоверсии без участия делегата.

С другой стороны, если вы посмотрите на исходный код, вы увидите, что некоторые вещи могут стать немного сложнее при использовании делегирования. Легко получить доступ к данным модели, когда вы привязываете обработчик к отдельному представлению элементов (this.model.get("number")). Если вы используете делегирование, вы должны использовать косвенные способы. Итак, как всегда, - компромисс. Пока вы смотрите только на производительность, но нет.

+0

Это был отличный и подробный ответ, который я ищу. Кроме того, я хотел бы добавить здесь, что мы можем иметь репозиторий представления, где каждый созданный вид может быть сохранен, и мы можем получить оттуда и иметь модель легко, что я делаю в данный момент. –

+0

Звучит интересно. Однако, как реакция на кишок, я бы с осторожностью относился к использованию репозитория: он вводит глобальное состояние через черный ход, что плохо для проверки, и это может привести к утечкам памяти, если они не будут правильно управляться. Возможно, это безопаснее, например.для хранения идентификатора модели (или 'cid') в качестве атрибута данных в элементе DOM каждого представления элемента, затем сохраните ссылку на коллекцию в представлении списка и извлеките модель с помощью' view.collection.get (modelId) ' , Просто мысль. – hashchange

+0

Да, точно так же я делаю это так же, как и идентификатор DOM, такой же, как и идентификатор вида, а затем доступ к нему для получения модели или удаления представления. –

Смежные вопросы