events - 单击事件未在 Backbonejs 的主视图中触发

标签 events button backbone.js click

我有一个非常奇怪的问题。我正在尝试实现“根” View ,它也可以用作某些 namespace 结构。 codeschool.com 类(class)第二部分中介绍了相同的原理。在这个 Root View 中,我想捕获事件“单击按钮”,但这就是问题所在。当我点击按钮时什么也没发生。

window.App = new (Backbone.View.extend({
  el: $("#app"),
  Collections: {},
  Models: {},
  Views: {},
  Routers: {},
  events: {
    'click button' : function(e) {
      alert("Thank god!");
    }
  },
  render: function(){
    //for test purposes
    console.log($("#app").find("button"));
    console.log(this.$el.find('button'));
  },
  start: function(){
    this.render();
    new App.Routers.PostsRouter();
    Backbone.history.start({pushState: true});
  }
}))();



$(document).ready(function() { App.start() });

HTML 看起来像这样

<body>
    <div id="app">
        <div id="posts"></div>

        <button>Click me</button>
    </div>
</body>

真正奇怪的是渲染函数中 console.log 的输出。两个选择器都是相同的,甚至上下文也相同,那么问题出在哪里呢?

console.log($("#app").find("button")); //this returns correct button
console.log(this.$el.find('button')); //this returns 0 occurences (WTF?)

编辑: 在 el: "#app" 稍作修改后,仍然存在同样的问题。问题是(感谢@nemesv)在加载 DOM 之前实例化此类。但是,在加载 DOM 后不可能实例化,因为这样就不可能使用该命名空间结构(例如 App.Model.Post = Backbone.Model.extend() )。但这种“具有 namespace 结构的主视图”是在 codeschool.com 类(class)中作为某种良好实践引入的。解决方案可以在那里找到http://jsfiddle.net/BckAe

最佳答案

您已将 el 指定为 jquery 选择器,但由于您位于对象文字内部,因此在加载 DOM 之前它会立即求值。

因此 el: $("#app"), 不会选择任何内容。

您可以通过使用一项 Backbone 功能来解决此问题,您可以将 el 初始化为包含选择器的字符串。

因此将您的 el 声明更改为:

el: "#app"

您的点击事件不会被触发,因为您在加载 DOM 之前实例化了 View ,因此主干无法为您进行事件委托(delegate)。

因此,您需要将 View 声明和创建分为两个步骤。并且仅在加载 DOM 时实例化您的 View :

var AppView = Backbone.View.extend({
   el: "#app",  
   //...
});

$(document).ready(function() 
{ 
    window.App = new AppView();
    App.start() 
});

演示:JSFiddle .

关于events - 单击事件未在 Backbonejs 的主视图中触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14828978/

相关文章:

javascript - 如果在具有相同值的两个选项之间切换,如何检测 Select 更改事件?

javascript - Backbone.js 继承问题

jquery - 在 Model.destroy() 的成功回调中更新 View

java - 显示隐藏的html代码的按钮?

javascript - "all"事件的一个好的用例是什么?

javascript - 如何判断一个拖放操作是否指向浏览器窗口之外的某个地方?

events - PostgreSQL 中的事件调度器?

windows - 如何安排 Windows 任务在注销时运行

html - 如何在不影响提交按钮点击动画的情况下进行转换?

button - 道场 : how to set to disable new button