Backbone.js:为什么不绑定此事件?

时间:2011-02-05 20:50:26

标签: javascript backbone.js

我有一个简单的待办事项列表,并且所有内容都按预期呈现,但是当我点击编辑表单中的提交按钮时,表单被提交(GET / todo_items),并且页面被重新加载只显示编辑形成。 “提交表单”事件没有受到约束,我无法弄清楚原因。我错过了什么?

App.Views.Edit = Backbone.View.extend({
  events: {
    "submit form": "save"
  },
  initialize: function(){
    this.render();
  },
  save: function(){
    var self = this;
    var msg  = this.model.isNew() ? 'Successfully created!' : 'Saved!';

    this.model.save({
      title: this.$('[name=title]').val(),

      success: function(model, resp){
        console.log('good');
        new App.Views.Notice({message: msg});
        self.model = model;
        self.render();
        self.delegateEvents();
        Backbone.history.saveLocation('todo_items/'+ model.id);
        $('#edit_area').html('');
      },
      error: function(){
        console.log('bad');
        new App.Views.Error();
      }
    });

    return false;
  },
  render: function(){
    $('#edit_area').html(ich.edit_form(this.model.toJSON()));
  }
});

以下是编辑表格:

<script id="edit_form" type="text/html">
  <form>
    <label for="title">Title:</label>
    <input name="title" type="text" value="{{title}}" />
    <button>Save</button>
  </form>
</script>

2 个答案:

答案 0 :(得分:25)

Backbone在el元素上使用delegateEvents。如果您未指定“el”或不使用“el”呈现视图,则事件委派将不起作用。而不是做

$("#edit_area") 
在渲染中

,将其作为构造函数中的“el”选项传递:

edit = new App.Views.Edit({el: $("#edit_area")})

在视图代码中的任何地方都将其称为this.el,尤其是在渲染中。

答案 1 :(得分:0)

经过几个小时的修改后,它在我在视图中明确设置el并在$(this.el)函数中使用render之后就有效了。怪异。