Backbone JS查看事件没有被解雇?

ahe*_*ick 28 jquery backbone.js

我正在尝试使用Backbone JS,到目前为止,一切似乎都很有意义并且工作顺利.

但是,使用下面的代码,我的自定义事件似乎没有被触发.以下代码中的任何内容都可以说明原因可能是什么?我是否需要在视图中"初始化"任何内容?关于代码/结构的任何其他指针也会很酷.下面是我的完整JS/HTML.

JS

var Todo = Backbone.Model.extend({});

var TodoCollection = Backbone.Collection.extend({

    model: Todo,
    url: '/Home/Todos'

});

var AppView = Backbone.View.extend({

    // where it should listen, required?
    el: $(".content"),

    events: {
        "keypress #new-todo": "enter"
    },

    initialize: function () {
        // _.bindAll(this, "render", "createOnEnter");
        // this.collection.bind("all", this.render);
    },

    hi: function () {
        alert('ohai');
    },

    render: function () {
        var lis = '';
        $.each(this.collection.models, function () {
            lis += '<li>' + this.get('Text') + '</li>';
        });
        $('#todo-list').append(lis);
        return this.el;
    },

    enter: function (e) {
        alert('hi');
    }

});


var TodoController = Backbone.Controller.extend({

    routes: {
        "": "todos"
    },

    initialize: function (options) { },

    todos: function () {
        var todolist = new TodoCollection();
        todolist.fetch({
            success: function (data) {
                var appview = new AppView({ collection: data });
                appview.render();
            }
        });
    }

});

$(function () {
    window.app = new TodoController();
    Backbone.history.start();
});
Run Code Online (Sandbox Code Playgroud)

HTML

<div id="todoapp">
    <div class="content">
        <input id="new-todo" placeholder="What needs to be done?" type="text" />
        <div id="todos">
            <ul id="todo-list">
            </ul>
        </div>
        <a href="#">say hey</a>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

Jul*_*ien 37

el: $(".content")
Run Code Online (Sandbox Code Playgroud)

试试这个:

var appview = new AppView({ el:$(".content"), collection: data });
Run Code Online (Sandbox Code Playgroud)

你不能在那里调用jQuery,因为尚未创建DOM.当视图作为我的示例或初始化加载时,您必须这样做.

  • var AppView = Backbone.View.extend({})在浏览器读取它时进行评估.您在文档就绪调用中实例化它,但由于_el_不是函数,因此它将作为扩展的一部分进行评估. (5认同)
  • 有人可以解释为什么Backbone.js Todo示例在创建AppView时不需要传入参数吗?他们在todo.js的顶部有这个注释,"//一旦DOM准备好,使用`jQuery.ready`:"加载应用程序,但是我没有看到他们做任何事情来确保DOM准备就绪.谢谢. (3认同)
  • 而不是`el:$('.content')`,你可以在不使用包装器的情况下执行`el:'.content``,然后每次创建视图时都不需要传递它.在初始化时,backbone会将字符串包装在`$()`中.这是比每次创建视图时传递它更好的解决方案. (3认同)
  • 没关系.我想我明白了.这是因为他们把所有东西都包裹在$(function {})中;对吗? (2认同)

Jes*_*obs 16

此外,要使您的事件起作用,您必须将渲染功能中的内容绑定到this.el. 事件都绑定到您指定的元素,因此您需要将事件生成元素作为子元素绑定到充当委托者的元素.

  • 我想两次这个评论,但我不能,这正是我的问题,10倍! (3认同)