2013-06-11 3 views
0

Я играю с backbone.js в первый раз, но не могу заставить события стрелять должным образом. Может кто-нибудь объяснить, что я делаю неправильно?Простые базовые события не срабатывают

Большое спасибо!

в app.js погруженных в нижней части моего HTML:

var Discussion = Backbone.Model.extend({ 
    defaults: { 
     id: null, 
     title: 'New discussion' 
    }, 
    urlRoot: '/api/discussion' 
}); 

var DiscussionCollection = Backbone.Collection.extend({ 
    model: Discussion, 
    url: '/api/discussion' 
}); 

var DiscussionView = Backbone.View.extend({ 
    events: { 
     'click .btnCreateDiscussion': 'create', 
     'keypress #discussion_title': 'create' 
    }, 

    initialize: function(){ 
     //this.$el = $("#form_discussion"); 
     this.template = _.template($('#discussion-template').html()); 
    }, 

    render: function(){ 
     console.log("rendering"); 
     return this;  
    }, 

    create: function(){ 
     console.log('creating a new discussion') 
    } 
}); 

var discussionView = new DiscussionView({ el: $("#form_discussion"), model: Discussion }); 

HTML:

<form action="" id="form_discussion" method="post"> 

<label for="discussion_title">Discussion Title</label> 
<input type="text" id="discussion_title" name="discussion_title" /> 

<input class="btnCreateDiscussion" type="button" value="Create Discussion"> 

<script type="text/template" id="discussion-template"> 
    <h1><%= title %></h1> 
    </script> 
+2

Есть что-то, что не работает, я просто установил этот [jsFiddle] (http://jsfiddle.net/xCEE6/4/), кажется, работает нормально. –

+0

Является ли инициализация вида хранимой в '$ (document) .ready()'? – Cyclone

+0

Созданный jsFiddle, кажется, работает отлично, но локально он не запускает мои события. Я продолжу расследование и отчитаюсь. – Jorre

ответ

1

Проблема была в jQuery. Последняя версия 1.x не работает, но использование последней версии 2.x устраняет проблему. Было бы полезно, если бы кто-нибудь мог объяснить, почему мы должны использовать только 2.x в этом случае?

Спасибо за помощь всем.

-1

Прежде всего, вы должны вызвать Backbone.View.prototype.initialize в вашем переопределен метод, чтобы инициализировать Backbone слушателей событий:

initialize: function(){ 
    //this.$el = $("#form_discussion"); 
    this.template = _.template($('#discussion-template').html()); 
    Backbone.View.prototype.initialize.call(this) 
}, 

Во-вторых, делают вид в Initialize - это не лучшая практика. Используйте для этого отдельного метода render.

+0

Не нужно вызывать 'Backbone.View.prototype.initialize.call (this)', Backbone вызовет этот метод, если он установлен в представлении. если вы посмотрите на источник базовой линии, вы увидите, что эти методы пустые. Также из документов. Если представление определяет функцию инициализации, оно будет вызываться, когда представление сначала создается. –

1

Кажется, что хорошо работает: http://jsfiddle.net/Jbahx/. (Проверить позвоночник & подчеркивание версии, и убедитесь, что DOM инициализируется)

О том, что вы делаете неправильно, хотя:

  • model: Discussion когда инстанцирование Вашего мнения. Вы должны представить представление экземпляра модели, а не класса. Если вы даете представление модели (необязательно), это обычно потому, что вы хотите представлять данные конкретного экземпляра.
  • Ваш метод визуализации никогда не называется, но в данный момент он бесполезен, так что это не проблема.
  • this.template = _.template($('#discussion-template').html()); в initialize метод. Поместите это как свойство представления при расширении, чтобы он был помещен в прототип вашего представления (даже если он выглядит как одиночный): template: _.template($('#discussion-template').html()),.
+0

Проблема была связана с jQuery. Использование версии 2.x вместо самой последней версии 1.x устраняет проблему. Потратьте мне много времени;) – Jorre

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