0

私はゾンビのリファレンスケースのように見えるものに直面しています。

まず、これは私が使用しているコードです。

ここに私のユーザーの詳細マネージャーのレイアウトの要点があります

代わりに、コントローラーはここにあります

操作の流れは次のとおりです。

  1. 管理者は、コントローラーで「manageUsers」を呼び出すルートにアクセスすると、ユーザーのリストにアクセスします。
  2. 管理者がユーザー行をクリックすると、イベント「users:selected」がトリガーされ、リスナーは操作するユーザーインスタンスを受け取ります。
  3. DetailsLayoutは、アプリケーションのメインレイアウトでインスタンス化およびレンダリングされます。特にその「コンテンツ」領域で。
  4. ユーザー詳細フォームを処理するビューもインスタンス化され、DetailsLayoutの「dettagli」領域内にレンダリングされます。
  5. この時点で、管理者はこのユーザーのメモの管理に関心があります。そこで、彼は「notes」というラベルの付いたタブをクリックすると、notesLayoutの「note」領域にメモのリストが表示されます。
  6. 管理者が操作したいメモをクリックすると、イベント「notes:selected」が発生し、メモインスタンスが適切なイベントハンドラー(DetailsLayout.showNote)に渡されます。

この時点で、管理者がDetailsLayout.showUsersを起動するリンクをクリックすると、前述のコントローラーによってリッスンされたイベント「users:index」が起動され、上記のリストのポイント1に戻ります。

ポイント5までプロセス全体を繰り返すと期待どおりに機能しますが、管理者が作業するメモを選択するとすぐに、デバッガーは、DetailsLayout領域の「メモ」が定義されていないというエラーを表示します。

コードを段階的に実行すると、2回目の実行で、発生したイベントが、最初のパスで使用されたインスタンスにまだバインドされているポイント6を除いて、DetailsLayoutの適切なインスタンスに正しくバインドされていることがわかりました。

上記のコードは、ユーザーの詳細が表示されるたびに、DetailsLayoutの新しいインスタンスが作成されることを示しています。これは、ゾンビがまだいないことを保証するのに十分ではありませんか?バックボーン.marionetteのドキュメントから正しく思い出すと、layout.region.show()がヒットするたびに、前のビュー(イベントのバインド解除とその他すべて)が閉じられ、新しく渡されたビューがアタッチされます。

私が間違ったやり方をしているのは何ですか?

よろしくお願いします。よろしく

PS

Backbone.marionetteのバージョンは0.8.4です

Backbonejsのバージョンは0.9.2です

4

1 に答える 1

2

UserDetailsListのコンストラクターに問題があります。

            constructor: (@user) ->
                console.addHistory("DetailsLayout","INIT")
                super()
                Hub.vent.on("notes:selected",(note) => @showNote(note))
                Hub.vent.on("notes:show", => @showNotes())
                Hub.vent.on("notes:save", (note) => @saveNote(note))
                Hub.vent.on("notes:delete", (note) => @deleteNote(note))
                Hub.vent.on("notes:new", => @showNote(new Note()))

Hub.ventこれらのイベントに直接バインドしますが、明示的にバインドを解除することはありません。したがって、UserDetailsリストのインスタンスはメモリ内で永久にぶら下がっています。

これを修正するには、レイアウトのメソッドを使用する必要があります。このメソッドは、バインディングを追跡し、レイアウトのメソッドが呼び出されbindToたときにバインドを解除します。close

            constructor: (@user) ->
                console.addHistory("DetailsLayout","INIT")
                super()
                @bindTo(Hub.vent, "notes:selected",(note) => @showNote(note))
                @bindTo(Hub.vent, "notes:show", => @showNotes())
                @bindTo(Hub.vent, "notes:save", (note) => @saveNote(note))
                @bindTo(Hub.vent, "notes:delete", (note) => @deleteNote(note))
                @bindTo(Hub.vent, "notes:new", => @showNote(new Note()))

レイアウトが不要になったら、必ず正しく閉じてください。closeレイアウトインスタンスでメソッドを呼び出します。bindToこれにより、コンストラクターが設定したすべてのイベントが正しくクリーンアップされます。

参考までに-aLayoutはから直接拡張されるため、、などの使用を含む、ItemViewに関するすべての情報/ドキュメントは、にItemViewも適用されます。LayoutbindToclose

于 2012-05-29T01:10:17.800 に答える