2

listView.templateについてのテンプレートを認識するために、に値を渡す必要がありますcollection.length
この方法でパラメーターを渡すために、serializeDataメソッドを再定義するのが1つのオプションだと思います。

var ListView = Marionette.CompositeView.extend({

    initialize: function () {
        this.collection.on('reset', this.serializeData, this);
        this.collection.on('remove', this.serializeData, this);
        this.collection.on('add', this.serializeData, this);
    },

    serializeData: function () {
        console.log(this.collection.length);
        return {
            has_tasks: this.collection.length > 0
        };
    },

    // other codes
});

私が開始したときappcollectionはまだフェッチされていないので:

1.a )collection.legth = 0
2.b)テンプレートはhas_tasks = false期待どおりに取得されます。

2.a)フェッチ後collection.length is > 0
2.b)が呼び出され、serializeDataそれが配置 されます。2.c)テンプレートが保持されているため、テンプレートがレンダリングされていないようです。has_tasks = true
has_tasks = false

何か考えは2.c

4

2 に答える 2

3

最新のMarionetteは、ビューでオプションtemplateHelpersを呼び出してビューに追加のコンテキストを提供することにより、この問題を解決しました。また、イベントバインディングは、ビューがアンロードされたときに正しく自動アンバインドされないため、マリオネットに対応していません。したがって、ビューで行う必要があるのは次のとおりです。

var ListView = Marionette.CompositeView.extend({

    initialize: function () {
        this.bindTo(this.collection, "add", this.render, this);
        this.bindTo(this.collection, "remove", this.render, this);
        this.bindTo(this.collection, "reset", this.render, this);
    },

    templateHelpers: function () {
        console.log(this.collection.length);
        return {
            has_tasks: this.collection.length > 0
        };
    },

    // other codes
});

ただし、アイテムが追加または削除されるたびに、ビュー全体とすべてのサブ要素を再レンダリングしたくない場合があることに注意してください。より良いアプローチは、表示されたカウントのみを更新することです。例えば:

var ListView = Marionette.CompositeView.extend({

    initialize: function () {
        this.bindTo(this.collection, "add", this.updateCount, this);
        this.bindTo(this.collection, "remove", this.updateCount, this);
        this.bindTo(this.collection, "reset", this.updateCount, this);
    },

    updateCount: function() {
        this.$('.count_span').html(this.collection.length);
    },

    // other codes
});
于 2012-07-04T19:27:57.597 に答える
2

私は単に次のようなものを使用します:

var ListView = Marionette.CompositeView.extend({
  initialize: function () {
    this.bindTo(this.collection, 'reset', this.render)
  },
  serializeData: function () {
    return { has_tasks: this.collection.length > 0 }
  }
});

serializeDataを再度呼び出しても、ビューに影響はありません。新しい値を表示するには、もう一度レンダリングする必要があります(もう一度render呼び出すとデータが取得されるためserializeData)。

hasTaskとにかく、コレクション(したがってその長さ)にアクセスできるので、テンプレートに送信するポイントは何ですか?

于 2012-07-04T11:57:42.477 に答える