2

私は Ext JS 4.1 を使用して CRM タイプのアプリケーションを作成しています。サーバー側に接続するために、 経由で Ext Direct を使用していRemotingProviderます。

アプリケーションを起動してレンダリングする前に、Ext Direct を介してサーバーからいくつかのグローバル変数を取得したいと考えています。主に、現在ログインしているユーザーの構成済み言語と構成済みのアクセス許可です。次に、(その結果から) ユーザーの言語に応じて、Ext JS ロケール ファイルと独自のカスタム ロケール ファイルの両方を読み込む必要があります。(これらは後で適用されないため、コンポーネントを作成する前にロードする必要があることに注意してください。)

したがって、手順は次のとおりです。

  1. 経由でグローバルを取得Ext.php.Globals.getGlobals
  2. Ext.loader.loadScript経由でExt ロケールを取得します。
  3. アプリのロケールを取得するExt.loader.loadScript
  4. ビューポートの設定

1.-3. 非同期であるため、コールバックをネストする以外に方法はありませんでした。

Ext.application({
  name: 'MyApp',

  launch: function() {
    var app = this;

    // Welcome to callback hell...
    Ext.php.Globals.getGlobals(function(data) {
      // insert globals into app namespace
      Ext.apply(MyApp, data);

      // load ext locale
      Ext.Loader.loadScript({
        url: 'ext/locale/ext-lang-'+MyApp.currentUser.culture.toLowerCase()+'.js',
        onLoad: function() {
          // load app locale
          Ext.namespace('MyApp.locale');
          Ext.Loader.loadScript({
            url: 'app/locale/'+MyApp.currentUser.culture.toUpperCase()+'.js',
            onLoad: function() {

              // FINALLY, set up viewport
              var viewport = Ext.create('MyApp.view.Viewport', {
                controller: app
              });

              if (MyApp.util.hasPermission('usermgmt'))
                app.getController('Locations');

              // and so on ...

            }
          });
        }
      });
    });
  }
}); // end application

このコードを書くための他のよりエレガントな方法はありますか? 非同期フロー用のライブラリがあることは知っていますが、これらのいずれかがここで Ext JS API と連携できますか? または、どうにかExt.syncRequireしてロケールを強制的にロードすることはできますか (そのため、getGlobals呼び出し用のネストのレイヤーは 1 つしかありません)。私自身のロケールにはクラスが定義されていますが、Ext ロケールには定義されていません。また、これはSencha Cmdを使用してソースファイルをコンパイルする際に何らかの形で台無しになりますか?

4

2 に答える 2

3

あなたのコンセプトは少し変わっているので、いくつかの推奨事項があります。私は多くのプロジェクトでダイレクトを使用していますが、ほとんどのプロジェクトではローカリゼーションとかなり複雑な AC 管理が必要でした。

  • アプリが起動する前に何かを解決したりロードしたりする必要はありません。
  • メイン アプリケーション ビューが読み込まれるときに、言語とローカリゼーションを提供する必要があります
  • フロントエンドがアクセス制御を解決するべきではありません。(ほとんどの状況で) 直接 API を使用してこれを完全に達成できます。
    • ユーザーがアクセスできるこれらのアクションにAPIを減らします(これは、アプリケーションのメインビューが準備されるときにも起こります)

これにより、アプリが高速になり、生活が楽になります。

アップデート

ユーザーがログインするとき、またはメインビューを要求するだけのときは、サポートされているブラウザー言語や、少なくともユーザーが言語を選択したときなど、十分な情報が必要です。その知識があれば、ビューを準備するだけです。

フロントエンド内の ACL は安全ではなく、サーバー側で再チェックする必要があるため、回避するか単純にする必要があります。direct を使用する最も簡単な方法は、ユーザー アクセスに一致する API を提供し、フロントエンド内でこれを確認することです。これは一種の暗黙的なアクセス制御です。これを実装する方法は UI によって異なりますが、多くの方法があります。

更新 2

言語ごとに 1 つのビルドを提供してみませんか? 反対する理由は見当たりません。または、フレームワークをアプリケーションとクラスから分割して、クライアントがキャッシュされたフレームワーク lib を引き続き使用できる間に更新できるようにします。

API は、コントローラー (バックエンド) アクセスとメソッド (バックエンド) アクセスを簡単に確認できます。コントローラーがタブであり、アクションがメニュー要素である場合。API はグローバルに使用できるため、オブジェクトまたはプロパティが存在するかどうかを確認するだけで済みます。という名前のバックエンドコントローラーがCarあり、呼び出されたメソッドがあると仮定Driveして、これを次のように確認できます

if (Car) {
    // has controller access
    if (Car.Dirve) {
        // has access to the 'drive' action
    }
}
于 2013-02-05T19:10:25.647 に答える
1

非常に明白な何かが欠けていない限り、これに対する私の見方は完全に異なるでしょう。

ユーザーが asuperuserまたはa である可能性があるシステムで同様のシナリオがありadmin、これに基づいてメインメニューが変更されます。

しかし、Ext アプリケーション コード内からサーバーにこの情報を問い合わせることはしません。代わりに、私のヘッダーには、直接ロードする方法と非常によく似たものが含まれています。

<script type="text/javascript" src="globals.php"></script>

次にglobals.php、これらの行に沿って何かがあります:

<?php
if ( $iUserIsSuperuser ) {
?>

gUserIsSuperuser = true;

<?php
}
?>

次に、ロケール js ファイルについては、条件を使用して index.php に正しいファイルを単純に含めることはできませんか?

于 2013-02-06T01:43:47.793 に答える