2012-02-04 8 views
0

backbone.js(またはJavascript?)のようなものは、私が期待していない奇妙な振る舞いをしています。これは、(の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

デバッグ後、jsfiddle.netで問題を再現することはできませんでしたが、コードで解決しました。 私は、Survey Collectionがロードされる前であっても、 'SidebarView'の宣言の最後に' window.Sidebar = new Application.Views.Sid​​ebar.SidebarView'を呼び出していました。どういうわけかこれは何かを台無しにしました。今私は '$ - > window.Sidebar =新しいApplication.Views.Sid​​ebar.SidebarView'を呼び出すと、それは魔法のように動作します。 – iblue

+0

'#backbone-sidebar'要素はDOMにまだありませんでした。それが呼び出されたときに定義されていなかった理由です - サイドバーインスタンスを作成するために変更したときにonDocumentReadyターゲット要素が既に作成されていて動作しました –

+0

@TomTu: @ el'は文字列を含んでいますが、なぜDOMツリーの影響を受けますか? – iblue

答えて

3

コメントありがとうございました。私は今、自分で質問に答えることができます。問題を解決するために、window.Sidebar = new Application.Views.Sidebar.SidebarViewの前に$ ->を追加しました。これにより、DOMツリーが読み込まれるまで待機します。これは$(function() {});でそれを包むのCoffeeScriptのと同等である

さらなる説明:

1. this.elが消滅:(私は以前使用)spine.jsとは異なり

、BACKBONE.JSがいるようですelで指定されたセレクタを参照してください。セレクタが見つからない場合、this.elは未定義です。

2. $()はあなたがクロームデバッガで$を評価する場合は、それが何か役に立つように見えないいくつかの機能を返します

再定義されます。私は正確に何が起こっていたのか把握することはできませんでしたが、$("some-random-css-selector")は期待どおりに機能しました。

+0

ありがとう、それは私がthis.elがなぜエルのidを持っているテンプレートからページの一部をロードしていて消えていったのかを説明しています。 –

関連する問題