Несколько событий, запускаемых при просмотре рендера - PullRequest
3 голосов
/ 15 февраля 2011

Я создаю приложение, используя Backbone.js, однако столкнулся с проблемой, которую не могу исправить на раннем этапе.

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

Мой взгляд выглядит так (написано на CoffeeScript):

#
# Project List View
#
class ProjectListView extends Backbone.View

  el: $("#projectList")

events : {
  "click #addProject" : "createNewProject"
}

initialize : ->
  @template = _.template(app.projectListView)
  _.bindAll(this, "render", "createNewProject")
  @render()

createNewProject : (e) ->
  e.preventDefault()
  e.stopPropagation()
  tempProject = Projects.create({
    title : 'Test Project'
    description : ''
    browserDefault : 12
    lineHeight : 21
  })

render : =>
  $(@el).html(@template())
  @delegateEvents()
  return @

Очевидно, что события закончились, и я не получаю никаких событий щелчков. Что мне здесь не хватает?

Ответы [ 2 ]

3 голосов
/ 16 февраля 2011

Код, который вы вставили, не имеет правильного отступа. Это так было изначально?

Вам не нужна строка _.bindAll. Вместо этого просто используйте => для определения ваших методов (вместо ->)

Я внес некоторые стилистические изменения и достал лишние @delegateEvents, как предложил Жюльен. Посмотрите, работает ли это:

class ProjectListView extends Backbone.View

  el: $("#projectList")

  events:
    "click #addProject" : "createNewProject"

  initialize: =>
    @template = _.template(app.projectListView)
    @render()

  createNewProject: (e) =>
    e.preventDefault()
    e.stopPropagation()
    tempProject = Projects.create
      title: 'Test Project'
      description: ''
      browserDefault: 12
      lineHeight: 21

  render: =>
    @el.html @template()
    @
2 голосов
/ 15 февраля 2011

Вот мои комментарии к вашему коду.Backbone автоматически делегирует события (используя DelegateEvents) в зависимости от вашего варианта событий.Вам не нужно делать это в функции рендеринга (скорее всего, причина двойных событий, генерируемых на вас).Удалите deleteEvents из вашего рендера.

Кроме того, @el уже определен как объект jQuery, поэтому вам не придется делать это снова при рендеринге.

Будете ли вы создавать 2 представления списка проектов?Если так, то идентификаторы должны быть уникальными ...

...