10

我正在尝试让自己熟悉 CoffeeScript 和backbone.js,但我一定遗漏了一些东西。

这个咖啡脚本:

MyView  = Backbone.View.extend 
   events: { 
     "click" : "testHandler" 
   } 

   testHandler: -> 
     console.log "click handled" 
     return false 

 view = new MyView {el: $('#test_container')} 
 view.render()

生成以下 JavaScript:

(function() {
  var MyView, view;
  MyView = Backbone.View.extend({
    events: {
      "click": "testHandler"
    },
    testHandler: function() {
      console.log("click handled");
      return false;
    }
  });
  view = new MyView({
    el: $('#test_container')
  });
  view.render;
}).call(this);

但是当我单击时该click事件不会触发。testHandlertest_container

如果我将输出 JavaScript 更改为:

$(function() {
  var MyView, view;
  MyView = Backbone.View.extend({
    events: {
      "click": "testHandler"
    },
    testHandler: function() {
      console.log("click handled");
      return false;
    }
  });
  view = new MyView({
    el: $('#test_container')
  });
  view.render;
});

删除call(this)并附加$,一切都按预期工作。我错过了什么?

4

4 回答 4

7
(function () {}).call(this);

只是一种在指定接收者时立即调用匿名函数的方法。它的工作方式基本上与以下相同:

this.method = function () {};
this.method();

$(function () {}),至少在 jQuery 中,是

$(document).ready(function () {})

它在 DOM 树完全构建后运行给定的函数。这似乎是您的Backbone.View.extend功能正常工作的必要条件。

于 2010-11-05T17:38:09.583 回答
5

要将 CoffeeScript 和 jQuery 一起用于应用程序脚本,请将您的代码放在这种模板中:

$ = jQuery
$ ->

  MyView = Backbone.View.extend
    events:
      "click": "testHandler"
    testHandler: ->
      console.log "click handled"
      false

  view = new MyView el: $('#test_container')
  view.render()
于 2010-11-07T14:49:23.023 回答
3

尝试使用 CoffeeScript 类声明语法,例如:

class BacklogView extends Backbone.View
  constructor: (@el) ->
    this.delegateEvents this.events

  events:
    "click" : "addStory"

  # callbacks
  addStory: ->
    console.log 'it works!'
于 2011-02-11T21:58:42.793 回答
2

当视图或至少 view.el 是动态生成时会发生什么?您可以调用 view.delegateEvents() 方法来手动设置事件处理程序。

这是类似的咖啡脚本,用于在 ParentView 中呈现 ChildView,然后委派 childView 的事件。

window.ParentView = Backbone.View.extend
  addOne: (thing) ->
    view = new ChildView({model: thing})
    this.el.append view.render().el 
    view.delegateEvents()
于 2011-01-05T04:54:46.417 回答