1

特定のURLに移動すると、コントローラーメソッドが起動され、ItemViewがアプリケーションのリージョンの1つに読み込まれます。このItemView自体(親)には、少数の子ItemViewが含まれ、それ自体がレンダリングされるときにすべてがレンダリングされます。親のItemViewは次のとおりです。

return Backbone.Marionette.ItemView.extend({
    template: Handlebars.compile(template),
    ui: {
        textInput01: "#text-input-01"
    },
    events: {
        // no events yet
    },
    initialize: function() {
        // no init yet
    },
    onRender: function() {
        this.appRoutefinderTextinputItemView = new AppRoutefinderTextinputItemView({parentView: this});

        $(this.ui.textInput01).html(this.appRoutefinderTextinputItemView.render());
    }
});

そして、これが現在の唯一のItemViewです:

return Backbone.Marionette.ItemView.extend({
    template: Handlebars.compile(template),
    events: {
        // no events yet
    },
    initialize: function() {
        // no init yet
    },
    onRender: function() {
        // no onRender yet
    }
});

initialize何らかの理由で、子のとメソッドの両方が起動していて、onRender必要なデータがすべて存在しているように見えても、子がレンダリングされていないか、「空白」の方法でレンダリングされているため、親が変更されていないため、理解できません。見る。

私が理解している限りrender()、ItemViewをインスタンス化/参照するときに暗示されるので、子を呼び出す必要はありませんか?電話を切ってもrender()同じ結果になります。

他のItemView内からItemViewをレンダリングすることについて、私が見逃している何かがあると想定する必要がありますが、ドキュメントを精査しても役に立たなかったようです。

二次的な質問は次のようになります:私は適切な方法で子のビューをインスタンス化していますか、それともそうするためのより良い方法がありますか?

*編集-いくつかの実験の後、「受け入れられた」解決策は、親ビューを拡張されたItemViewであるレイアウトにすることであるように見えます。これは機能します。ただし、ItemView内のItemViewが機能しないのはなぜか疑問に思っています。render()手書きのメソッドをItemViewに統合するつもりですか、それを維持するつもりでしたか?

4

1 に答える 1

3

元のコードの問題は次の行です。

$(this.ui.textInput01).html(this.appRoutefinderTextinputItemView.render());

バックボーンビューのrenderメソッドは、レンダリングされたHTMLを返しません。このメソッドはel、ビューのレンダリングと更新を行います。このメソッドの戻り値は、ビュー自体です。マリオネットはこの動作を変更しません。

textInput01にビューのを入力するには、コードを変更する必要がありますel。また、this.ui.textInput01はすでにjQueryで選択されたオブジェクトであるため、再度ラップする必要はありません。


this.appRoutefinderTextinputItemView.render();
this.ui.textInput01.html(this.appRoutefinderTextinputItemView.el);
于 2012-10-23T14:19:37.460 に答える