2

バックボーンのデータ駆動型パラダイムでは、バックボーン ビュー/ルーターはモデル変更をサブスクライブし、モデル変更イベントに基づいて動作する必要があります。この原則に従って、アプリケーションのビュー/ルーターを互いに分離することができます。これは素晴らしいことです。

ただし、アプリケーションの状態には、モデルに保持されない多くの変更があります。たとえば、To Do アプリでは、「完了」、「未完了」、または「すべて」のタスクを表示できるボタンが存在する可能性があります。これは、モデルに永続化されていないアプリケーションの状態です。タスクの完了状態は保持されますが、ビュー内の現在のフィルターは一時的な状態であることに注意してください。

このようなアプリケーションの状態に対処するための良い方法は何ですか? バックボーンされていない単純な状態を使用すると、ビュー/ルーターがこの状態の変更をリッスンできないため、データ駆動型パラダイムでのコーディングが難しくなります。

4

2 に答える 2

2

ボタンフィルターの例は、 Model eventsを使用して適切に解決できます。

あなたのボタンハンドラーはタスクコレクションにアクセスできると思います。次に、次のように、選択したモデルに対してコレクションとトリガー イベントをフィルター処理します。

model.trigger( "filter:selected" )

また

model.trigger( "filter:un-selected" )

ModelViewは、そのモデルでこれらのイベントをリッスンすることができ、それに応じて動作します。

これは、使用しない、または選択したような「永続的でない属性」を尊重するという要件に従っていますが、永続的であってはならない場合でも、特別な属性を使用するトラウマはありません。したがって、モデルの選択された属性を変更して、揮発性の状態を表すこともお勧めします。

したがって、ボタンハンドラーでコレクションをフィルター処理し、モデルで選択した属性を変更することが私の推奨ソリューションです。

model.set( "selected", true )

いつでもオーバーライドModel.toJSON()してクリーンアップするか、この特別な属性syncを残してサーバーに移動し、そこで無視することができます。

于 2012-08-22T16:55:27.300 に答える
0

コメントが長くなったので、比較するために2番目の回答を作成します。

まず、「完了」、「未完了」は完全に永続化されるアイテム モデル属性のように感じます。または、アイテムが多くのユーザーによって所有され、それぞれが独自の「完了」「未完了」状態を持っている場合、アイテムには completedState サブモデルなどがあります。ポイントは、@fguillenが2つの可能な解決策を作成したことですが、モデルに属性とほとんどの作業を行うボタン/ビューを含めるという2番目の方法も好みます。

私には、モデルが独自のカスタム イベントを持つことは意味がありません。フィルター ボタンは、適切なビューを提供するだけでよいように思えます。(どの項目を表示するか) したがって、ボタン要素で、コレクションに対して多かれ少なかれ直接フィルターを実行する関数を呼び出すようにします。

event: {
    'click filterBtnCompleted':'showCompleted'
},
showCompleted: function(event) {
    var completedAry = this.itemCollection.filter(function(item) {
        return item.get('completed');
    });

    // Code empties your current item views and re-renders them with just filtered models
}

このような便利なフィルター関数をコレクション自体に隠しておく傾向があるため、次のように呼び出すことができます。

this.ItemCollection.getCompleted(); // etc.

これらの属性をモデルに残して、サーバー上で無視しても問題ありません。繰り返しになりますが、永続化したい属性のように思えます。

もう1つ、バックボーンのないプレーンな状態を使用するとイベントが犠牲になるとあなたは言いました。(ニヤニヤ :-) そうじゃない!オブジェクトを簡単に拡張して Backbone.Event 機能を持たせることができます。

var flamingo = {};

_.extend(flamingo, Backbone.Events);

これで、flamingo トリガーを使用して、他のものと同じようにイベントをリッスンできます!

編集: ルータに対処する > データ取引を見る -------------------//

私がルーターで行うことは、あなたが行うことではないかもしれませんが、私の appView をオプションとしてルーターに渡します。サブビューを作成する showView() という appView の関数があります。したがって、ルーターは、私が扱っているビューにほとんど直接アクセスできます。

// Router
initialize: function(options) {
    this.appView = options.appView;
}

私たちの場合、完成したアイテムを表示するためにフィルタリングする必要があるのは itemsView かもしれません。注: サブビューを管理する showView() 関数もあります。シナリオで appView を直接操作しているだけかもしれません。

/items/#completed のようなルートが呼び出されたとき、私はこのようなことをするかもしれません。

routes: {
    'completed':'completed'
},
completed: {
    var itemsView = ItemCollectionView.create({
        'collection': // Your collection however you do it
    });
    this.appView.showView(itemsView);

    itemsView.showCompleted(); // Calls the showCompleted() from View example way above
}

これは役に立ちますか?

于 2012-08-22T18:29:56.623 に答える