Backbone.js重新定义$()并且this.el消失了

时间:2012-02-04 23:23:41

标签: backbone.js coffeescript

看起来像backbone.js(或Javascript?)有一些我没想到的奇怪行为。这是我的(简化的)Backbone View(在CoffeeScript中):

class Application.Views.Sidebar.SidebarView extends Backbone.View
  el: "#backbone-sidebar"
  template: JST["backbone/templates/sidebar"]

  initialize: () ->
    # Yes, I am currently skipping addOne and addAll functions,
    # because it is not needed to reproduce the problem
    Articles.bind 'all',     @render

    Articles.fetch()

  render: =>
    $(@el).html(@template())
    @ 

问题出在render函数中:当我在调试器中运行它时,@el未定义。此外,$()函数由backbone.js重新定义为某个getElementById包装器。当我使用window.$("#backbone-sidebar")时,我得到了正确的jQuery功能,但这只是一种解决方法。

有没有办法获得jQuery的$()

为什么@el未定义?

1 个答案:

答案 0 :(得分:3)

感谢您的评论。我现在能够自己回答这些问题。为了解决这些问题,我确实在window.Sidebar = new Application.Views.Sidebar.SidebarView前加$ ->,这使得它等待加载DOM树。这是CoffeeScript相当于将其包装在$(function() {});

进一步解释:

<强> 1。 this.el消失了:

与spine.js(我之前使用过)不同,backbone.js似乎查找el中指定的选择器。如果找不到选择器,则this.el将不确定。

<强> 2。 $()已重新定义

如果您在Chrome调试器中评估$,它将返回一些看起来不太有用的功能。我无法弄明白,究竟发生了什么,但$("some-random-css-selector")按预期工作。