2

我正在使用 Ext JS 4.1 创建一个 CRM 类型的应用程序。为了连接到服务器端,我通过RemotingProvider.

在应用程序启动和渲染之前,我想通过 Ext Direct 从服务器检索一些全局变量,主要是当前登录用户的配置语言及其配置的权限。然后,根据用户的语言(根据该结果),我需要加载 Ext JS 语言环境文件和我自己的自定义语言环境文件。(请注意,必须在创建任何组件之前加载它们,因为之后不会应用它们。)

所以,程序是:

  1. 通过获取 GlobalsExt.php.Globals.getGlobals
  2. 通过获取 Ext 语言环境Ext.loader.loadScript
  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调用)?我自己的语言环境定义了一个类,但 Ext 语言环境没有。另外,这会以某种方式弄乱使用Sencha Cmd编译源文件吗?

4

2 回答 2

3

你的概念有点奇怪,所以我有一些建议给你。我在许多项目中直接使用,其中大多数都需要本地化和相当复杂的 AC 管理。

  • 您的应用程序甚至不需要在启动之前解析或加载某些内容。
  • 应在加载主应用程序视图时提供语言和本地化
  • 你的前端永远不应该解决任何访问控制。您可以(在大多数情况下)使用直接 API 完美地实现这一点
    • 将 API 减少到用户可以访问的这些操作(当应用程序主视图准备好时也会发生这种情况)

这使您的应用程序更快,您的生活更轻松。

更新

用户登录或仅请求主视图的时间,您应该有大量信息,例如支持的浏览器语言,或者至少在用户选择一种语言时。有了这些知识,您只需要准备视图。

前端中的 acl 不安全,需要在服务器端重新检查,因此应该避免或简单。直接使用最简单的方法是提供与用户访问权限匹配的 API,并在前端进行检查。那是一种隐式访问控制。如何实现这取决于 UI,但有很多方法

更新 2

为什么不为每种语言提供一个构建?我看不出有任何反对的理由。或者将框架从您的应用程序和类中分离出来,这样您就可以在客户端仍然可以使用缓存的框架库时进行更新。

可以轻松检查 API 的控制器(后端)访问和方法(后端)访问。控制器可能是您的选项卡,而操作可能是您的菜单元素。由于 API 是全局可用的,您只需要检查对象或属性是否存在。假设我们有一个名为Car和 Method的后端控制器,Drive我们可以像这样检查

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

除非我遗漏了一些非常明显的东西,否则我对此的看法将完全不同。

我在用户可能是 asuperuser或 an的系统中有类似的场景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 回答