3

Marionette.CompositeViewこれらの2つの例(1)と(2)に基づいて、serializeDataとonRenderの違いを理解したいと思います 。

ドキュメントによると、テンプレートを適用する前に serializeData が render で呼び出され、テンプレートを適用した後に onRender が render で呼び出されます。

私の質問は次のとおりです
。1)例(1)が機能し、(2)が機能しないのはなぜですか?
2) コレクションをリセットすると、Marionette.CompositeView再レンダリングされますか?

詳細については、コード内のコメントを参照してください。


(1)

return Marionette.CompositeView.extend({

        initialize: function () {
            this.collection = new MyCollection();
            this.collection.fetch();
        },

        onRender: function () {
            this.collection.length > 0 ? this.$el.show() : this.$el.hide();
           // it returns this.collection.length > 0 
           // differently from serializeData.
        }
});

(2)

return Marionette.CompositeView.extend({

        initialize: function () {
            this.collection = new MyCollection();
            this.collection.fetch();
        },

        serializeData: function () {
            this.collection.length > 0 ? this.$el.show() : this.$el.hide(); 
           // it returns this.collection.length = 0 
           // even if this.collection.length > 0. Why?
        }
});
4

1 に答える 1

6

1)あなたが言ったようにonRender、ビューをレンダリングした後に呼び出される単なるコールバック関数です。

serializeDataバックボーン マリオネットのドキュメントに記載されているように、有効な JSON オブジェクトを返す必要があります。

データのカスタム シリアル化が必要な場合は、ビューに serializeData メソッドを提供できます。モデルまたはコレクションで .toJSON を呼び出した場合と同様に、有効な JSON オブジェクトを返す必要があります。

Backbone.Marionette.ItemView.extend({
  serializeData: function(){
    return {
      "some attribute": "some value"
    }
  }

});

2) IMO、答えはイエスです。Backbone Marionette のドキュメントには、次のように書かれています。

CollectionView: 自動レンダリング

コレクション ビューは、指定されたコレクションの「追加」、「削除」、および「リセット」イベントにバインドします。

ビューのコレクションが「リセット」されると、ビューはそれ自体で render を呼び出し、コレクション全体を再レンダリングします。

モデルがコレクションに追加されると、コレクション ビューはその 1 つのモデルをアイテム ビューのコレクションにレンダリングします。

モデルがコレクションから削除 (または破棄/削除) されると、コレクション ビューが閉じて、そのモデルのアイテム ビューが削除されます。

于 2012-08-10T10:35:21.043 に答える