看起来像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
未定义?
答案 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")
按预期工作。