2012-01-25 4 views
4

カテゴリツリービューをRequireJSとBackboneアプリケーションに書き直しています。バックボーン、RequireJS、ツリー

構造は単純です。各カテゴリには、子カテゴリのコレクションが含まれています。

しかし、循環依存関係の問題はすぐに明らかになります。カテゴリモデルにはカテゴリコレクションが必要であり、カテゴリコレクションにはカテゴリモデルが必要です。

はRequireJSドキュメントにおける循環依存関係について簡単な宣伝文句があります:

http://requirejs.org/docs/api.html#circular

しかし、私がまだundefinedsおよび/またはエラーを取得していますので、私は何かが欠けてるようです。私は、例では「b」ではなく「a」であることを見ていると思っています。

明らかにすることができる簡単な例は誰でも提供できますか?これ、またはこれを構造化するより良い方法は、循環依存を必要としません。

+0

あなたは循環依存性が必要ですか? require.jsドキュメントに書かれているように、「循環依存関係はまれであり、通常はデザインを再考したいという兆候です。 – SunnyRed

+0

はい、これは当てはまります。しかし、私は上記の構造を概説しました。再帰/循環依存でないツリー構造を提供できる場合は、その例を提供してください。 –

+0

Sry、私は一目ぼれに正しくデザインを理解していませんでした。したがって、a)はsthを使用しています。問題のようなカテゴリとサブカテゴリ? b)あなたはこれらを見たことがありますか:http://stackoverflow.com/questions/6150378/backbone-with-a-tree-view-widget&http://stackoverflow.com/questions/6026752/backbone-collections-representing-ツリーデータ。 c)問題を明確にするために現在のコードを追加すると、役立つと思います。 – SunnyRed

答えて

2

require.jsが "a"の前提条件として "b"をロードしているとき、aがinitModule()にまだ呼び出されていないため、 "a"の値を返すことはできません。ただし、b.somethingElse()が呼び出されるまでに、モジュール「a」が初期化され、require("a")呼び出しが返されます。

次のコードは、両方のモジュールの内部にあるものを示しています。ロードされる順番は関係ありません。 require.jsの例を少し変更して、もっと明白にしました。 一般循環参照に悪いデザインの症状いる間

// Inside a.js: 
define(["require", "b"], 
    function initModule(require) { 
     return { 
      doSomehingWithA: function() { ...}, 
      doSomethingElse: function(title) { 
       // by the time this function is called, 
       // require("b") will properly resolve 
       return require("b").doSomethingWithB(); 
      } 
     } 
    } 
); 

// Inside b.js: 
define(["require", "a"], 
    function initModule(require) { 
     return { 
      doSomethingWithB: function() {...}, 
      doSomethingElse: function(title) { 
       // by the time this function is called, 
       // require("a") will properly resolve 
       return require("a").doSomethingWithA(); 
      } 
     }; 
    } 
); 

ところで、それは必ずしもそうではありません。たとえば、ウィジェットファクトリモジュールを実装しました。これは、とりわけ、コンテンツを作成するためにファクトリを参照しなければならない「コンテナウィジェット」モジュールを参照しました。完璧に合法です。