2

簡単にするために、チェックボックスで複数のフォルダーを選択できるフォルダーツリーと考えることができるUIコントローラーがあります。選択はモデルに保存され、「保存時に」いくつかのアクションがトリガーされることはほとんどありません。

使いやすさの理由から、同じコントローラーの 2 つの異なる視覚化を使用したいと考えています。2 つの UI コントローラは、一部のレイアウトでは同時に存在できますが、他のレイアウトでは一度に 1 つしか存在できません。

2 つの UI コントローラーで同じコレクション インスタンスを再利用できると便利です。

これは 1 つのモジュールで簡単に実行できますが、異なるモジュール間で機能するようにするには、コードをどのように構成すればよいでしょうか? モデルとコレクション クラスを含むモジュール、View1 を含むモジュール、View2 を含むモジュールを考えていましたが、コレクションのインスタンスを配置して他の世界と通信させるのに最適な場所はどこですか。

Marionette でバックボーン モデル/コレクション インスタンスを 2 つ以上のビューと共有するためのベスト プラクティスは何ですか?

4

1 に答える 1

3

1 つのアプローチは、エンティティ (モジュール/コレクション) を別のモジュールに配置し、さまざまなモジュールにそれらを要求させることです。

エンティティ モジュールの例 (コレクション定義とリクエスト ハンドラーを含む): https://github.com/davidsulc/marionette-gentle-introduction/blob/master/assets/js/entities/contact.js#L89

コレクションをリクエストする例 (7 行目): https://github.com/davidsulc/marionette-gentle-introduction/blob/master/assets/js/apps/contacts/list/list_controller.js#L7

あなたの場合、必要に応じて同じインスタンスを再利用できます。ただし、適度に新しいデータを表示するための何らかのメカニズムがあることを確認してください (つまり、サーバー上のコレクションを取得して最新のデータを取得します)。

これを行うには、javascript のクロージャ メカニズムを使用できます。

ContactManager.module('Entities', function(...){
  var contacts = new Entities.ContactCollection(...);
  contacts.fetch();

  ContactManager.reqres.setHandler("contact:entities", function(){
    return contacts;
  });

  ContactManager.commands.setHandler("contact:entities:update", function(){
    return contacts.fetch();
  });
});

次に、アプリでContactManager.request("contact:entities")連絡先を取得するために使用し、ContactManager.execute("contact:entities:update").

リクエストとコマンドの違いは、基本的にセマンティックです。つまり、アプリケーションの別の部分からデータをリクエストすることと、実行する作業を注文することです。

リクエスト/レスポンスを使用すると、アプリケーションをより適切に設計できます (疎結合、カプセル化)。データを にアタッチするApp.SomeNamespace.mycollectionこともできます (特定のケースで実行しました) が、密結合につながり、カプセル化が壊れるため、大規模なアプリケーションにはお勧めしません。

于 2013-07-11T21:25:19.297 に答える