Представления с пространством имен Backbone.js Представления, не запускающие события

#javascript #ruby-on-rails-3.1 #backbone.js #coffeescript

#javascript #ruby-on-rails-3.1 #backbone.js #coffeescript

Вопрос:

В настоящее время я начинаю с Backbone.js . Я написал несколько примеров с Backbone, и они отлично работают. Но теперь мне нужно использовать Backbone.js с Rails 3.1 и CoffeeScript. Я взял свои хорошо работающие примеры и переписал на CoffeeScript, используя камень backbone-rails.

И возникла следующая проблема. Я упростил код, но проблема все еще остается

У меня есть следующие файлы:

Здесь я запускаю свое базовое приложение в файле main.js.coffee в соответствии с моим main_controller в приложении rails:

 $ = jQuery
$->
  CsfTaskManager.init()
  

Вот описание приложения backbone:

 #= require_self
#= require_tree ./templates
#= require_tree ./models
#= require_tree ./views
#= require_tree ./routers

window.CsfTaskManager =
  Models: {}
  Collections: {}
  Routers: {}
  Views: {}
  init: ->
    new CsfTaskManager.Routers.AppRouter()
    Backbone.history.start()
  

Это маршрутизатор моих приложений:

 class CsfTaskManager.Routers.AppRouter extends Backbone.Router
  initialize: (options) ->
    goalsBlock = new CsfTaskManager.Views.goalsView()

  routes:
    "!/": "root",
    some other routes...
  

И, наконец, просмотр:

 class CsfTaskManager.Views.goalsView extends Backbone.View

  initialize: ->
    this.goals = new CsfTaskManager.Collections.GoalsCollection()

  el: $('div#app'),

  events:
    "click .add-btn": "addGoal"

  addGoal: ->
    alert('ji')
  

HTML-страница содержит такой код:

 <div id="app">
    <div class="app-screen hidden" id="goal-form" style="display: block; ">
      <button class="btn" id="load">
        Load
      </button>
      <h3>
        New Goal
      </h3>
      <div class="form-stacked">
        <form accept-charset="UTF-8" action="/goals" class="new_goal" id="new_goal" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"><input name="authenticity_token" type="hidden" value="Pnt V/tS1/b079M/1ZIRdw2ss1D6bvJKVh868DXRjUg="></div>
          <label for="goal_title">Title</label>
          <p></p>
          <input class="goal-title" id="goal_title" name="goal[title]" size="30" type="text">
          <p></p>
          <label for="goal_note">Note</label>
          <p></p>
          <input class="goal-note" id="goal_note" name="goal[note]" size="30" type="text">
        </form>
      </div>
      <p>
        <button class="add-btn btn">
          Add
        </button>
      </p>
      <ul id="goals-list"></ul>
    </div>
    <table class="app-screen bordered-table" id="calendar-grid" style="display: none; ">
      <tbody><tr>
        <td colspan="2">
          week
        </td>
      </tr>
      <tr>
        <td>
          day
        </td>
        <td>
          <div id="calendar"></div>
        </td>
      </tr>
    </tbody></table>
    <div class="app-screen hidden" id="role-form" style="display: none; ">
      <h3>
        New User Role
      </h3>
      <div class="form-stacked">
        <form accept-charset="UTF-8" action="/roles" class="new_role" id="new_role" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"><input name="authenticity_token" type="hidden" value="Pnt V/tS1/b079M/1ZIRdw2ss1D6bvJKVh868DXRjUg="></div>
          <label for="role_title">Title</label>
          <p></p>
          <input class="role-title" id="role_name" name="role[name]" size="30" type="text">
          <p></p>
          <label for="role_note">Note</label>
          <p></p>
          <input class="role-note" id="role_description" name="role[description]" size="30" type="text">
        </form>
      </div>
      <p>
        <button class="add-btn btn">
          Add
        </button>
      </p>
    </div>
  </div>
  

Итак, элемент .add-btn вложен в #app, но нажатие на эту кнопку не запускает событие.
Где может быть проблема?

Раньше, когда у меня было одно и то же приложение в одном файле .js, без coffeescript, namespacing и backbone-rails gem, все было в порядке.

Кстати, AppRouter работает нормально, объект goalsView тоже создан успешно, но события по некоторым причинам не запускаются.

Пожалуйста, дайте мне какую-нибудь подсказку, потому что я действительно застрял…

Ответ №1:

Я думаю, что проблема может заключаться в следующей строке в CsfTaskManager :

   el: $('div#app'),
  

Обычно el должен быть либо строкой выбора jQuery, либо элементом DOM. Здесь вы передаете объект jQuery. Попробуйте изменить его на:

  el: 'div#app'
  

(запятая также не требуется в CoffeeScript).