3

Marionette.ItemView
対応機種変更時に使用して作成したリストを再レンダリングしたいItemView

このタスクをアクティブにする最善の方法について何か考えはありますか?

// Collection passed to Marionette.CompositeView
myCollection.attributes = [
    {
        id: 1,
        name: 'bar'
        closed: false
    },
    ….
];

// Marionette.ItemView
myModel.set({
    closed: true
}); // when this model change I would like to re-render the copositeView 
    // or remove the Marionette.ItemView

PS:
で次のコード(1)を試してみるとMarionette.ItemView
モデルを保存するときに次のエラーが発生します(2)。

(1)

// Marionette.ItemView
initialize: function () {
    this.model.on('change', this.render);
}

(2)

Uncaught TypeError: Object [object Object] has no method 'serializeData'
4

5 に答える 5

17

マリオネットはmodelEvents、モデルイベントへの適切なバインドを処理するプロパティを提供します。

ItemViewに以下を追加するだけで、モデルが変更されたときにItemViewが普遍的に更新されます

'modelEvents': {
    'change': 'render'
},

楽しみ!

于 2013-02-25T10:28:35.100 に答える
6

Marionette でイベントのバインドとバインド解除が自動的に機能するようにするには、ビューのbindToメソッドを使用する必要があります。例えば:

initialize: function() {
  this.bindTo(this.model, 'change', this.render);
}

またbindTo、コンテキストを正しく設定するので、必要ありません_.bindAll()

于 2012-07-03T17:57:46.100 に答える
2

おそらく、これはあなたがやろうとしていたことのようなものですか?

MyItemView = Marionette.ItemView.extend({
    modelEvents: {
        "change:closed": "render"
    }
});

MyCompositeView = Marionette.CompositeView.extend({
    itemView: MyItemView
});

MyApp.addRegions({main_region: "#main"});

MyApp.main_region.show(new MyCompositeView({collection: new MyCollection()});

デフォルトでは、Marionette.ItemView には、this.model で toJSON を呼び出した結果を返すだけの serializeData 関数があります。もちろん、他の JavaScript オブジェクトを拡張する場合と同様に、ItemView 拡張機能で独自の serializeData を定義することにより、この関数をオーバーライドできます。HTH

于 2013-03-13T02:25:59.393 に答える
2

プロトタイプを変更する ItemView で、デフォルトでこの動作を有効にすることができます。

Backbone.Marionette.ItemView.prototype["modelEvents"] = { "change" : "render"};
于 2013-03-07T14:28:32.920 に答える
0

initializeメソッドで_.bindAllを使用することをお勧めします。問題がスコープに関連している可能性があります。

initialize: function () {
    _.bindAll(this);
    this.model.on('change', this.render);
}

bindAllで問題が解決しない場合は、モデルとビューを貼り付けてください。

于 2012-07-03T13:33:17.943 に答える