backbone.js简单视图事件未触发

324*_*423 5 backbone.js

有人可以告诉我为什么以下不起作用.我点击链接时会发出警报

<body>
    <a class="newnote" href="#">Add new note</a>
</body>

<script>
var note = Backbone.Model.extend({});

var notes = Backbone.Collection.extend({
    model: note,
    url: '<?= $this->createUrl('/filenotes/api'); ?>'
});

var note_view = Backbone.View.extend({
    el: 'table',

});

var Appview = Backbone.View.extend({
    el: $('body'),

    events: {
        "a click" : "showForm"
    },
    initialize: function(){
        //alert('hi');  
    },
    showForm: function(){
        alert('hi');
    }
});

var v = new Appview();
</script>
Run Code Online (Sandbox Code Playgroud)

这里有一个jsfiddle http://jsfiddle.net/neilcharlton/yj5Pz/1/

Der*_*ley 19

您的$("body")选择器在加载DOM之前触发,因此它返回空并且从不绑定到链接.

Backbone对象定义是使用对象文字定义的,这意味着它们会在定义时立即进行评估,而不是在实例化模型时进行评估.

这个:

Backbone.View.extend({foo: "bar"})
Run Code Online (Sandbox Code Playgroud)

在功能上与此相同:

var config = {foo: "bar"};
Backbone.View.extend(config);
Run Code Online (Sandbox Code Playgroud)

由于您有一个$("body")选择器作为值el,因此只要解析了View配置就会对其进行评估,这意味着DOM尚未加载,并且不会返回任何内容.

解决这个问题有很多选择...所有这些都涉及延迟选择器的评估,直到加载DOM之后.

我个人最喜欢的是在DOM加载后将选择器传递给实例化的视图:

var AppView = Backbone.View.extend({
  // don't specify el here
});

$(function(){
  // after the DOM has loaded, select it and send it to the view
  new AppView({ el: $("body") });
}
Run Code Online (Sandbox Code Playgroud)

另外 - 像Skylar说,你的事件被宣布错了.

这是一个有效的JSFiddle:http://jsfiddle.net/yj5Pz/5/


Sky*_*son 9

对于初学者,events对象具有以下语法:

events: {
    "click a" : "showForm"
},
Run Code Online (Sandbox Code Playgroud)