Ext JS 简介

Ext JS 是一个 JavaScript 框架,它具有面向对象编程的功能。Ext JS 是一个“JavaScript 优先”的框架。 也就是说,用户界面及其逻辑都是在 JavaScript 中定义的。 各种包含的主题(例如 Material)提供了必要的样式。

Ext JS 为使用跨浏览器功能构建 Web 应用程序提供了丰富的 UI。 Ext JS 主要专注于前端用户界面,它支持所有现代浏览器。Ext JS 提供对 MVC 和 MVVM 应用程序架构的支持。

Ext 是封装 Ext JS 中所有类的命名空间。

MVC (Model-View-Controller)

在 MVC 架构中,大多数类是模型、视图或控制器。用户与视图交互,视图显示模型中保存的数据。这些交互由控制器监控,然后控制器根据需要通过更新视图和模型来响应交互。

  • Model(模型) :用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。一个数据字段的集合,可通过关联被链接到其他模型和通过代理链接到一个数据流。

  • View(视图):表示数据给用户。任何类型的组件,这些组件将信息输出到浏览器,如Form、Grid、Chart。

  • Controller(控制器):是 MVC 应用程序的逻辑部分。它处理事件并作出响应。“事件”包括用户的行为和数据 Model 上的改变。Ext.app.Controller 为控制器的基类。

View 和 Model 通常不知道彼此,因为 Controller 全权负责指导更新。一般来说,控制器将包含 MVC 应用程序中的大部分应用程序逻辑。理想情况下,视图几乎没有(如果有)业务逻辑。模型主要是数据的接口,并包含管理对所述数据的更改的业务逻辑。

MVC 的目标是明确定义应用程序中每个类的职责。因为每个类都有明确定义的职责,所以它们隐含地与更大的环境分离。这使得应用程序更易于测试和维护,并且其代码更易于重用。

MVVM

MVC 和 MVVM 之间的主要区别在于 MVVM 具有称为 ViewModel 的视图抽象。ViewModel 使用一种称为“数据绑定”的技术来协调 Model 的数据和 View 对该数据的表示之间的变化。

  • (VM) ViewModel - ViewModel 是管理特定于视图的数据的类。它允许感兴趣的组件绑定到它并在此数据更改时进行更新。

结果是模型和框架执行尽可能多的工作,最小化或消除直接操作视图的应用程序逻辑。

Ext.js 命名规范

Ext JS中的命名约定遵循标准 JavaScript 约定,这不是强制性的,而是遵循的良好做法。它应该遵循 Camel case 语法命名类,方法,变量和属性。如果 name 与两个单词组合,则第二个单词将始终以大写字母开头。

名称 惯例
Class Name 以大写字母开头,然后是camel case E.g. StudentClass
Method Name 以小写字母开头,然后是camel case E.g. doLayout()
Variable Name 以小写字母开头,然后是camel case E.g. firstName
Property Name 以小写字母开头,然后是camel case E.g. enableColumnResize = true
Constant Name 只有大写,E.g. COUNT, MAX_VALUE

在Ext JS中定义类

Ext.onReady 是指在整个页面加载完后执行。

<script type="text/javascript">
  Ext.onReady(function(){  
  //页面初始化代码
  });
</script>

Ext.define() 用于在 Ext JS 中定义类。

Ext.define(class_name, class_members/properties, callback_function);

  • 类名称:是根据应用程序结构的类名称 - appName.folderName.ClassName
  • 类属性/成员:定义类的行为。
  • 回调函数是可选的:当类正确加载时,会调用它。

Ext JS 定义类

Ext.define("Person", {
    //定义、初始化成员属性
    name: '',
    age: 0,
    //定义成员方法
    say: function (msg) {
        Ext.Msg.alert(this.name + " Says:", msg);
    },
    //定义构造函数
    constructor: function (name, age) {
        this.name = name;
        this.age = age;
    }    
});

创建对象

由两种方式可以创建对象:

  • 使用 new 关键字

    • var studentObject = new Person();
  • 使用 Ext.create() 方法创建

    • Ext.create('Ext.Panel', {
          renderTo: 'helloWorldPanel',
          height: 200,
          width: 600,
          title: 'Hello world',
          html: 'First Ext JS Hello World Program'
      });
      

继承

ExtJS 允许对现有的类进行扩展,其扩展可以通过继承来实现。

在Ext JS继承可以使用两种方法:

  • Ext.extend

    • //基类
      Ext.define("Developer", {
          extend: 'Person',        //继承
          coding: function (code) {
            Ext.Msg.alert(this.Name + " 正在编码..", code);
          },
          constructor: function(){
              this.callParent(arguments);
          }
      });
      
  • 使用Mixins : Mixins是在没有扩展的情况下在类B中使用类A的不同方式。

    • mixins : {
         commons : 'DepartmentApp.utils.DepartmentUtils'
      },
      

在构造函数中,通过调用 this.callParent()方法,实现对属性的初始化。如果此处只调用了父类的构造方法,则可以省略掉,ExtJS 会自动为我们调用父类的构造函数。

如果在子类中使用了自定义的构造函数,ExtJS 则不会再自动调用父类的构造函数。

像java导包一样,在html中要导入父类的js文件。

类的选项 - config

可以在定义类的时候为它添加配置项——config,它是Extjs的属性包装器,为属性提供get和set方法。

Ext.onReady(function(){
    Ext.define("Person", {
        config: {
            name: '',
            age: 0
        },
        say: function (msg) {
            //在方法中,“this.config.属性名”和“this.属性名”的形式都可以调用成员属性。
            Ext.Msg.alert(this.config.name+","+ this.age + " Says:", msg);
        },
        constructor: function (config) {
            this.initConfig(config);
        }
    });
    //注意:因为在类中将成员属性放进了config中,因此已不能用new的方式进行实例化了。
    //需要使用Ext的create方法创建并返回一个实例:
    var Tom = Ext.create("Person", {
        Name: 'Tom',
        Age: 26
    });
    Tom.Say("Hello");
    
    //使用Ext自动生成的set、get方法设置、访问实例属性
    //使用“Tom.config.Age”、“Tom.Age”都可以得到Age的值
    Tom.setAge(18);      //注:“Tom.Age=18”也可以——这是js赋值的方法
    alert(Tom.getAge()); //注:“Tom.Age”也可以——这是js取值的方法
})

在类的定义中添加了config项,将需要在配置中完成的属性添加在里面,而在构造函数中,我们通过调用this.initConfig方法完成对config的初始化;

在定义Person类对象的时候,使用Ext.create方法,传入类名Person以及配置项。

容器

Ext JS 中的容器是我们可以添加其他容器或子组件的组件。这些容器可以具有多个布局以将部件布置在容器中。 我们可以从容器和其子元素添加或删除组件。

Ext.container.Container 是 Ext JS 中所有容器的基类。

常用容器列表

Type Desc
Ext.panel.Panel 这是允许在正常面板中添加项目的基本容器
Ext.form.Panel Form面板为表单提供了一个标准容器,它本质上是一个标准的Ext.panel.Panel,它自动创建一个用于管理任何Ext.form.field.Field对象的BasicForm。
Ext.tab.Panel 标签面板就像一个普通的面板,但支持卡标签面板布局
Ext.container.Viewport Viewport是一个容器,它会自动调整大小到整个浏览器窗口的大小。 然后,您可以在其中添加其他ExtJS UI组件和容器

Ext.panel.Panel & Ext.form.Panel

<script type="text/javascript">
    Ext.onReady(function () {
        var child1 = Ext.create('Ext.Panel', {
            title:'Child Panel1',
            html: 'Text field1'
        });
        var child2 = Ext.create('Ext.Panel', {
            title:'Child Panel2',
            html: 'Text field2'
        });
        Ext.create("Ext.panel.Panel", {
            renderTo: Ext.getBody(),
            width: 100,
            height: 100,
            border: true,
            frame: true,
            items: [child1, child2]
        });
        Ext.create('Ext.form.Panel', {
            renderTo: Ext.getBody(),
            width: 100,
            height: 100,
            border: true,
            frame: true,
            layout: 'auto',// auto is one of the layout type.
            items: [child1, child2]
        });
    });
</script>

Ext.tab.Panel

<script type="text/javascript">
    Ext.onReady(function () {
        Ext.create('Ext.tab.Panel', {
            renderTo: Ext.getBody(),
            height: 100,
            width: 200,
            items: [{
               xtype: 'panel',
               title: 'Tab One',
               html: 'The first tab',
               listeners: {
                  render: function() {
                     Ext.MessageBox.alert('Tab one', 'Tab One was clicked.');
                  }
               }
            },{
               // xtype for all Component configurations in a Container
               title: 'Tab Two',
               html: 'The second tab',
               listeners: {
                  render: function() {
                     Ext.MessageBox.alert('Tab two', 'Tab Two was clicked.');
                  }
               }
            }]
         });
    });
</script>

Ext.container.Viewport

<script type="text/javascript">
    Ext.onReady(function () {
        var childPanel1 = Ext.create('Ext.panel.Panel', {
            title: 'Child Panel 1',
            html: 'A Panel'
        });
        var childPanel2 = Ext.create('Ext.panel.Panel', {
            title: 'Child Panel 2',
            html: 'Another Panel'
        });
        Ext.create('Ext.container.Viewport', {
        renderTo: Ext.getBody(),
            items: [ childPanel1, childPanel2 ]
        });
     });
</script>