0

マリオネットと、それがバックボーンに追加する構造を本当に楽しんでいます。ただし、単一のページでモジュールを再利用する方法に少し困惑しています。

カテゴリ ツリーのイベントをレンダリングして処理するマリオネット モジュールがあります。このモジュールを同じページで再利用したいと思います。これにより、ページのさまざまな領域にさまざまなコレクションが表示されます。マリオネット モジュールは基本的に Application オブジェクトのシングルトンであり、これもシングルトンであることに気付きました。モジュールの新しいインスタンスを作成して、別のリージョンの新しいコレクションのイベントを表示および処理できないようです。同様に、モジュールにはイベントを登録してトリガーすることはできません。これは、モジュールが 1 つしかなく、各リージョンでトリガーされるイベントが互いに独立している必要があるためです。

モジュールについて間違った考えを持っていますか? 異なる地域/コレクションで同じページでどのように再利用できますか?

4

2 に答える 2

4

モジュールを名前空間と考えてください。名前空間を複製しようとすることはありませんよね? しかし、コードの他の部分が複数のインスタンスを作成できるパブリック型を名前空間で公開することは非常に一般的です。

App.module('CategoryTree', function(self, App, Backbone, Marionette, $, _) {
   self.Collection = Backbone.Collection.extend( ... );
   self.CollectionView = Marionette.CollectionView.extend( ... );
   ...
});

//elsewhere...
var workingCollection = new App.CategoryTree.Collection( ... );
var workingView = new App.CategoryTree.CollectionView( ... );
var previewCollection = new App.CategoryTree.Collection( ... );
var previewView = new App.CategoryTree.CollectionView( ... );
于 2013-09-10T16:35:25.347 に答える
2

編集私はこれについて何が気に入らないかを理解しました... 不明な数のカテゴリツリーを表示する必要がある場合 (たとえば、AJAX 呼び出しに応答して)、あなたは水の中で死んでいます。


機能していると思われる解決策を 1 つ見つけました。基本的に、モジュール定義は単なる関数です。アプリケーションにモジュールを追加するときにその関数のみを使用する代わりに、グローバル スコープ内の別の場所で関数をそのまま定義して、その関数に到達できるようにします。

Project.Modules.CategoryTree = function(self, App, Backbone, Marionette, $, _) {
  // ... module definition goes here ...
}

このモジュールを使用したいときはいつでも、基本的に既存のモジュールまたはアプリケーションにサブモジュールとして追加します。そのようです...

App.module("WorkingTree", Project.Modules.CategoryTree)
App.module("PreviewTree", Project.Modules.CategoryTree)

これは 2 つの個別のインスタンスを作成することでモジュール コードを再利用しますが、私にはあまり適切ではありません。そこにもっと良い解決策はありますか?

于 2013-09-10T16:26:57.633 に答える