2

最近 (2.x / 3.x) xtype とファクトリ メソッドを使用して、同じくらい高速なクラスのインスタンスを受け取りました。これで、4.x と MVC を使用した最初のアプリを開始しました。チュートリアルで説明されているように、MVC パターンでは、使用したくないビューごとにクラスを拡張する必要があります。たとえ 1 回しか使用しない場合でもです。しかし、Sencha 自身が書いたベスト プラクティスには次のように書かれています。

再利用性または機能の追加のために拡張するだけです

私の場合、いくつかのパラメーターを除いて、1 つの基本クラスから作成できたとしても、たくさんのクラスを登録する必要があります。title, width,...

もう 1 つのポイントは、Controller は慣例により StoreId を上書きし、厳密な入力も必要とすることです。つまり、class-name は . で終わる必要がありsます。しかし、私が知る限り、コントローラーストア/モデル配列内のモデルもストアも惜しまないので、この規則の他のポイントはタイピングを惜しまないようです。

次のポイントは、3.X から 4.X にマージした後、アプリケーションの初期ロード時間が長くなったことです。これは、定義する必要がある多くの新しいクラスが原因であるか、またはすべてのコントローラーが起動時にインスタンス化されるという事実が原因であると思われますMVC パターンのデフォルトの動作によるものです。たとえば、アプリケーションコントローラーでリクエストした場合など、コントローラーを自動インスタンス化せずに怠惰にする方法はありますか?

はい、それはたくさんの質問ですが、それらはすべて同じトピックに関連していると思います。

編集

ソースコードを掘り下げた後s、ストアに名前を付けるときの要件について確信が持てなくなりました。MVCチュートリアルを進めているときに、これに出くわしたと思いました。誰でもこれを確認できますか?

編集2

私の結論

レーシー レンダリングは非常に単純です。まず第一に、コントローラーは ApplicationController コントローラー配列で言及されるべきではありません。このようなコントローラーのインスタンスを作成するには、ApplicationController.getController(pureClassName) [各コントローラーには、呼び出された ApplicationController への参照が含まれていることに注意して ください]メソッドとメソッドが ApplicationController によって呼び出されなくなっapplicationたことに注意する必要があります。これは自分で。内部参照キャッシュにこのコントローラーのインスタンスが既に存在する場合、ApplicationController の最初のルックアップを呼び出すと、インスタンスが作成され、コントローラー名が次のように挿入されます。init(application)onLaunch(application)getController()Id. したがって、コントローラーは一種のシングルトンであり、まったく問題ありません。コントローラー自体は、登録されたストア、モデル、およびビューのすべてのゲッターを作成し、推測ですが、それら (少なくともストア) をインスタンス化します。ストアの名前付けの制限については、s で終わることに制限はありません。

4

2 に答える 2

2

これらは非常に有効なポイントです。

まず、ExtJS 4 で MVC を使用する必要がないことを述べておく必要があります。コードで ExtJS 3 スタイルを引き続き使用できます。

MVC の利点を理解し、それを採用することに決めた場合は、そうです。クラスを拡張する必要があり、多少のオーバーヘッドが発生しますが、最終的にはよりクリーンで再利用可能なコードになることは確かです。トップレベルのビューを拡張する必要がありますが、その中の項目は古いスタイルでコーディングできます。これに加えて、コントローラーの init() 内で、特定のビュー構成を変更できます (これにより、クラス拡張は少なくなりますが、コントローラー コードが増えます)。

ExtJS 3 の経験があり、MVC スタイルのアプリに移行しようとしている場合、最終的には、関連する作業よりもメリットの方が大きいことがわかるでしょう。

個人的には、このような店舗との取引は初めて知りました。したがって、これについてはあまりコメントできません。

最後に、適切に作成された ExtJs 4 アプリ (動的読み込みを利用するアプリ) は、ExtJS 3 アプリよりも高速に読み込まれるはずです。アプリで使用されるコードのみを含む Ext バージョンをコンパイルすることもできます。はい、必要なときにコントローラー (およびそのビューとストア) をインスタンス化できます。これは魅力のように機能します。

loadPage: function(aControllerName)
{
    // save recent page in a cookie
    Ext.util.Cookies.set('RecentPage', aControllerName);

    // Dynamically load the controller
    var iController = this.getController(aControllerName);

    // Manually initialise it
    iController.init();

    // Load the page (by getting the first view of the controller).
    var iPage = this.getView(iController.views[0]).create();

    // Add the page to the content panel.
    var iContentPanel = this.getContentPanel();

    iContentPanel.removeAll(true);

    iContentPanel.add(iPage);

    iContentPanel.doLayout();
}
于 2012-02-28T12:40:44.483 に答える
1

1.Izhakiは怠惰なコントローラーの初期化についてのあなたの質問によく答えました。

2.私は店名についての不満についてあなたを本当にフォローしていません。店舗名に制限はありません。これらは、命名規則の単なる提案です。

3.Ext.defineメソッドは、Javaや他のオブジェクト指向言語と同様にクラスを定義するのに最適です。ただし、これは必須ではなく、Ext.createメソッドを使用して、フレームワークコンポーネントのインスタンスを作成し、カスタム構成オブジェクトを渡すことができます。Ext.defineを使用して基本クラスを作成してから、呼び出しExt.create('MyBaseClass',{title:'mynew tile'}); て基本クラスのわずかに変更されたバージョンを取得することもできます。

MVCクラスシステムに関するSenchaガイドを読み、それらの例を確認して理解を深めることをお勧めします。

于 2012-02-28T20:06:55.040 に答える