5

Backbone.Marionette.ItemViewのonRenderメソッドでも要素にアクセスできません。

たとえば、私は次のようにしています。

レンプレート:

<input type="text" id="searchBox">`

ItemView:

View = Backbone.Marionette.ItemView.extend
    template: searchTemplate
    onRender:
        @setTypeahead ['a', 'b', 'c', 'd']
    setTypeahead: (valueArray) ->
        console.log $('#searchBox')
        $('#searchBox').typeahead
            source: valueArray

予期せぬことに、コンソールに記録されたオブジェクトには入力要素が含まれていません。セレクターが機能しませんでした。何故ですか?

ここにあるMarionetteのgithubの小さなコードブロック内のコメントには、「ここを操作しelます。すでにレンダリングされており、ビューのHTMLでいっぱいで、すぐに使用できます」と記載されています。誤解しない限り、テンプレートはレンダリングされ、ItemViewのonRender関数内で操作できるようになると思います。

4

2 に答える 2

4

HTML要素はまだDOMに追加されていないため、jQueryセレクターをビューにスコープする必要があります。


View = Backbone.Marionette.ItemView.extend
    template: searchTemplate
    onRender:
        @setTypeahead ['a', 'b', 'c', 'd']
    setTypeahead: (valueArray) ->
        console.log $('#searchBox')

        @$('#searchBox').typeahead
            source: valueArray

動作する理由onShowは、その時点で要素がDOMに追加されるためです。ただし、これは、この特定のビューインスタンスの要素だけでなく、ページ内の指定されたクエリを持つすべての要素をセレクターが検索できるようにするため、お勧めできません。を使用すると、jQueryセレクターをビューインスタンスにスコープし、ビューがまだDOMに追加されていない場合でも@$("#searchBox")、ビュー内の要素を見つけることができます。$el

于 2013-01-13T04:34:26.700 に答える
3

もちろん、私が最終的にここで質問することに決めたらすぐに、私は自分で質問に答えます。

onShowの代わりに使用する必要がありonRenderます。マリオネットのドキュメントはまだ誤解を招くようです、IMO。

于 2013-01-12T00:22:42.240 に答える