0

私はほぼ一日中、次のことで苦労しています: コントローラー A が $.Controller を拡張し、B がコントローラー A を拡張する 2 つのコントローラーがあります。コントローラ A が何も知らないはずのイベントの場合。問題は、各コントローラーがダイアログを出力するためにいくつかのテンプレートを必要とし、コントローラーインスタンスによってはそれらが見つからないことです。コントローラーでテンプレートを使用するときは次のリンクをたどったため、常にテンプレート ファイルへの相対パスを使用します。これにより、jQuery.Controller._calculatePosition から計算された絶対パスが得られます。

http://javascriptmvc.com/docs.html#!jQuery.Controller.prototype.view

問題は、パスの計算中に「現在のインスタンス」のクラス名のみが使用され、基本クラスが考慮されていないように見えることです。このように、基本クラス コントローラー A のイベント ハンドラーを実行しているときにコントローラー B のインスタンスの計算されたパスは、インスタンス コントローラー B の名前を使用します。ただし、このコントローラーには、コントローラーのテンプレートがありません。 A、コントローラー A だけがテンプレート上にあることを知っている必要があります。この問題は、継承レベルが追加されるたびに発生します。たとえば、コントローラー B のイベント ハンドラーの一部がコントローラー C の背後にある要素に対して許可されていないため、コントローラー C がコントローラー B から継承されるためです。

this.view('//app/controller_a/views/some_template.ejs') へのフル パスを指定した場合にのみ、自動計算をオーバーライドできます。リファクタリング中などにパスを壊しやすい。

パスの共通部分を提供するか、静的メンバーなどに保存するコントローラーに関数を記述しようとしましたが、コントローラー B のインスタンスが常にコントローラー A のすべてを上書きするように見えるため、どちらも機能していないようでした。コントローラ B インスタンスからコントローラ インスタンスを呼び出すことができません。私が必要とするのは、クラス自体のインスタンスにのみ表示され、クラスを拡張することによってオーバーライドできない C++ クラスのプライベート変数のようなものです。しかし、私はそのようなものを動作させることができませんでした._superを使用しても、拡張コントローラーは最初に基本クラスから追加関数を実装する必要があり、.prototypeはコントローラーインスタンスBのみを参照し、何らかの理由で

新しいコントローラーごとにテンプレートへの完全なパスをハードコーディングする必要がある前に、これが最後のチャンスです。コントローラーと _calculatePosition の魔法を拡張して相対テンプレート パスを使用できる方法またはベスト プラクティスはありますか? または、this.view を呼び出すたびに完全なパスを入力する必要がない可能性はありますか?

助けてくれてありがとう!

4

1 に答える 1

0

リンク先のページに示されているように、このフォームを使用してください。

// renders with views/shared/top.ejs
el.before( this.view("shared/top", {phrase: "hi"}) );

「a/something.ejs」のような一意の名前を使用するのはあなただけですが、コントローラー A または B にロードするすべてのビューに「a」を使用します。

于 2013-06-14T20:08:49.490 に答える