web-dev-qa-db-ja.com

Marionette ItemView変更時にモデルを再レンダリングする方法

Handlebarsテンプレートエンジンを使用しています。
だから、モデルがあります:

Backbone.Model.extend({
        urlRoot: Config.urls.getClient,
        defaults: {
            contract:"",
            contractDate:"",
            companyTitle:"",
            contacts:[],
            tariff: new Tariff(),
            tariffs: [],
            remain:0,
            licenses:0,
            edo:""
        },
        initialize:function(){
            this.fetch();
        }
    });

次に、マリオネットItemView:

Marionette.ItemView.extend({
        template : templates.client,
        initialize: function () {
            this.model.on('change', this.render, this);
        },
        onRender: function () {
            console.log(this.model.toJSON());
         }      
    });

そして、私はすべてを次のように呼び出します:

new View({
    model : new Model({id:id})
        })

そして、それはすぐに私のためにビューをレンダリングし、これはクールです。しかし、モデルがデータをフェッチした後、それがトリガー「変更」であるため、コンソールにシリアル化されたモデルが2回表示されます。

ただし、ビューは更新されません。

どうすれば修正できますか?

追伸fetch doneコールバックでrenderメソッドを呼び出すことができることを理解しています。しかし、ユーザーがモデルを変更するときのさらなるアクションにも必要です。

21
Vadim Ivanov

実際、BackboneとMarionetteはそれを行うのに十分賢いです。
問題はテンプレートとデータにあり、私が見つけたとおりです 別の質問 。だから、私はすべてを再確認し、結果を得ました。

3
Vadim Ivanov

ビューでは、次のコードを使用できます

    modelEvents: {
        'change': 'render'
    }

の代わりに

   initialize: function () {
        this.model.on('change', this.render, this);
    },
    onRender: function () {
        console.log(this.model.toJSON());
     }
45
Fizer Khan