コレクションを表すバックボーンビューがあります。このコレクションがサーバーと同期され、新しいモデルがコレクションに追加されたら、古いモデルのビューインスタンスを表示し続けながら、コレクション内のこれらの新しいモデルを表すすべてのビューインスタンスを非表示にします。これどうやってするの?
2 に答える
基になるモデル/コレクションが変更された場合、Bbone のビューは自動的に更新されません。イベントを明示的にリッスンする必要があります。モデルの場合は変更/破棄、コレクションの場合は追加/変更/削除/リセットし、render() を呼び出します。
示唆されているようWiredPrairie
に、たとえばビューの初期化中にこれらのイベントのいずれかを listenTo() して明示的に render() に登録した場合は、いつでも stopListening() を使用して効果を逆にすることができます。
ビューが変更を表示しないようにする場合の代替方法は、ビューの render() でどのモデルが変更されたかを手動で確認し、変更された属性の以前の状態を使用して新しい値を表示しないようにすることです。 . チェックアウト:コレクションの場合とmodel.hasChanged()
同様model.previousAttributes()
に。options.previousModels
reset
Marionette.CollectionView
またはMarionette.CompositeView
ここで使用していると思いますよね?その場合、サーバーから戻ってきてコレクションに追加されたときに、これらが新しく追加されたモデルを表示しないようにしようとしていますよね?
これを行ういくつかの異なる方法を見ることができますが、そのほとんどは同じ場所から始まります。つまり、モデルを表示するかどうかを示す属性に基づいてフィルター処理するコレクションです。モデルを表示するかどうかを示すデータの一部がモデルに必要です...これがオフハンドでどのように見えるかはわかりませんが、ロジックを設定したら、残りは簡単になると思います。
プロキシ コレクション
CompositeView または CollectionView でこれを処理する私の推奨方法は、モデルを表示または非表示にする値に基づいてフィルター処理されるプロキシ コレクションを使用してビュー インスタンスを作成することです。
以前にプロキシ コレクションについて話しましたが、それらを構築する方法を示すための動作中の JSFiddle があります。
次のようにフィルター処理されたコレクションを設定し、フィルター処理されたコレクションを実際のビュー インスタンスに送信します。
var filtered = new FilteredCollection(myOriginalCollection);
filtered.filter({
showThisOne: true
});
var view = new MyCompositeView({
collection: filtered
});
myOriginalCollection.fetch();
ここからは、元のコレクションのフィルタリングとフェッチ/同期をどのように管理するかということになります。しかし、全体的な解決策は、プロキシ/デコレータ コレクションと、必要なアイテムのリストのみにコレクションをフィルタリングできることにかかっていると思います。