0

私の質問はおそらく非常に単純な答えを必要としますが、それにもかかわらず、私は簡単に見つけることができませんでした。

私が取り組んでいるバックボーンアプリケーションには、いくつかのビューがあります。さまざまなビューを定義するときは、初期化関数で_.bindAllを使用して、「this」ビューオブジェクトをビューのレンダリング関数に接続します。例えば:

DiscussedItemView = Backbone.View.extend({
    ...
        initialize: function() {
            _.bindAll(this, "render");
        },


        render: function() {    

            this.$el.attr('id', 'li-meeting-task-' + this.model.getId());

            this.$el.html(JST['tasks_sandbox/agenda_task_item']({ 
                taskName    : this.model.getName(),
                taskId      : this.model.getId()
            }));

            return this;
        },
    ...
});

DiscussedItemViewの新しいインスタンスを作成するには、次のようにします。

...
        var discussion_agenda_row = new DiscussedItemView({model: task});
        discussion_agenda_row.render();
        this.$( '#meeting-items-list' ).append(discussion_agenda_row.$el); 
...

コードは正常に機能します。それでも、discussion_agenda_rowでrender()関数を明示的に使用する必要がある理由がわかりません。新しいDiscussedItemViewインスタンスを初期化すると、自動的にrender関数が呼び出されると思いましたが、discussion_agenda_row.render();行を削除するとHTMLが表示されません。どこが間違っているの?

ありがとう、アレクサンドラ

4

2 に答える 2

2

いいえ、renderによって自動的に呼び出されることはありませんinitialize。ルーターや別のビューなど、アプリケーション内の他のコンポーネントは、ビューにいつレンダリングするかを指示します。

于 2012-05-21T18:22:16.033 に答える
1

ビューはモデルの変更に対応します。コードでは、モデルに変更を加えていないため、ビューが応答していません。また、変更をモデル化するためのリスナーとしてビューを設定していません。初期化でできることは次のようなものです。

initialize : function() {
    //this will tell the view to render when the model 
    //triggers a "change" event
    this.model.on("change", this.render, this);

    //this will make the model throw the change event
    //and since the view is listening to "change," render will be invoked.
    this.model.fetch();
}

とはいえ、フェッチを行っておらず、データがモデル内にある場合でも、view.render()を明示的に呼び出す必要があります。いずれにせよ、良いMVCのために、私はビューにモデルの変更をリッスンさせて、それに応じて適切に更新されるようにします。

于 2012-05-21T18:28:51.433 に答える