文档帮助

术语、图标和标签

许多类具有使用配置对象创建(实例化)类时使用的快捷名称。快捷名称称为别名(如果类扩展 Ext.Component,则称为xtype)。对于适用的类,别名/xtype 会列在类名称旁边,以便快速参考。

访问级别

框架类或其成员可以指定为privateprotected。否则,类/成员为publicPublicprotectedprivate是访问描述符,用于传达如何以及何时应该使用类或类成员。

成员类型

成员语法

下面是一个示例类成员,我们可以对其进行剖析以显示类成员的语法(在本例中,是从 Ext.button.Button 类查看的 lookupComponent 方法)。

lookupComponent ( item ) : Ext.Component
protected

在初始化items配置期间或添加新项时将原始配置对象添加到此容器中时调用,或添加或{@link #insert 插入}

此方法将传递的对象转换为实例化子组件。

子类中可能会覆盖此项,当需要对子项创建应用特殊处理时。

参数

item :  对象

要添加的配置对象。

返回
Ext.Component

要添加的组件。

我们来看看成员行中的每一部分

成员标志

API 文档使用许多标志来进一步传达类成员的功能和意图。标签可以用文本标签、缩写或图标表示。

类图标

- 表示框架类

- 单例框架类。*有关更多信息,请参见单例标志

- 组件类型框架类(Ext JS 框架中任何扩展 Ext.Component 的类)

- 表示类、成员或指南在当前查看的版本中是新的

成员图标

- 表示类型为 config 的类成员

- 表示类型为 property 的类成员

- 表示类型为 method 的类成员

- 表示类型为 event 的类成员

- 表示类型为 theme variable 的类成员

- 表示类型为 theme mixin 的类成员

- 表示类、成员或指南在当前查看的版本中是新的

类成员快速导航菜单

在 API 文档页面的类名正下方是与当前类拥有的成员类型相对应的按钮行。每个按钮按类型显示成员数(此计数在应用筛选器时更新)。单击按钮将导航到该成员部分。将鼠标悬停在成员类型按钮上将显示一个弹出菜单,其中包含该类型的所有成员,以便快速导航。

Getter 和 Setter 方法

与类配置选项相关的 Getter 和 Setter 方法将显示在方法部分以及 API 文档和成员类型菜单的配置部分中,它们与之一起工作的配置正下方。Getter 和 Setter 方法文档将位于配置行中,以便于参考。

历史记录栏

您的页面历史记录保存在本地存储中,并显示在顶部标题栏正下方(使用可用空间)。默认情况下,仅显示与您当前查看的产品/版本匹配的搜索结果。您可以通过单击历史记录栏右侧的 按钮并选择“全部”单选选项来扩展显示内容。这将显示历史记录栏中所有产品/版本的所有近期页面。

在历史记录配置菜单中,您还将看到最近访问的页面列表。结果按“当前产品/版本”和“全部”单选选项进行筛选。单击 按钮将清除历史记录栏以及保存在本地存储中的历史记录。

如果在历史记录配置菜单中选择了“全部”,则将启用“在历史记录栏中显示产品详细信息”的复选框选项。选中后,每个历史页面的产品/版本将与历史记录栏中的页面名称一起显示。将光标悬停在历史记录栏中的页面名称上还将以工具提示的形式显示产品/版本。

搜索和筛选器

可以使用页面顶部的搜索字段搜索 API 文档和指南。

在 API 文档页面上,还有一个筛选器输入字段,它使用筛选器字符串筛选成员行。除了按字符串筛选外,您还可以按访问级别、继承和只读筛选类成员。这是使用页面顶部的复选框完成的。

API 类导航树底部的复选框筛选类列表以包括或排除私有类。

单击空搜索字段将显示您最近的 10 次搜索,以便快速导航。

API 文档类元数据

每个 API 文档页面(除了 JavaScript 原始页面外)都有一个与该类相关的元数据的菜单视图。此元数据视图将具有以下一个或多个

展开和折叠示例和类成员

默认情况下,可运行的示例(小提琴)在页面上展开。您可以使用代码块左上角的箭头单独折叠和展开示例代码块。您还可以使用页面右上角的切换按钮切换所有示例的折叠状态。切换所有状态将在页面加载之间记住。

默认情况下,类成员在页面中折叠。您可以使用成员行左侧的箭头图标展开和折叠成员,或全局使用右上角的展开/折叠所有切换按钮。

桌面 -vs- 移动视图

在较窄的屏幕或浏览器上查看文档将导致针对较小尺寸进行优化的视图。桌面和“移动”视图之间的主要区别是

查看类源

可以通过单击 API 文档页面顶部的类名来查看类源。可以通过单击成员行右侧的“查看源”链接来查看类成员的源。

Sencha Touch 2.4


顶部

使用模型

最简单地说,模型只是一组字段及其数据。在本指南中,我们将研究 Ext.data.Model 的四个主要部分——字段代理关联验证

以下代码示例说明了模型的创建

Ext.define('User', {
    extend: 'Ext.data.Model',
    config: {
        fields: [
            { name: 'id', type: 'int' },
            { name: 'name', type: 'string' }
        ]
    }
});

使用代理

代理由存储区用于处理模型数据的加载和保存。有两种类型的代理:客户端和服务器。客户端代理的示例包括用于在浏览器的内存中存储数据的内存和在可用时使用 HTML 5 本地存储功能的本地存储。服务器代理处理将数据封送至某个远程服务器,示例包括 Ajax、JsonP 和 Rest。

代理可以直接在模型中定义,如下面的代码示例所示

Ext.define('User', {

    extend: 'Ext.data.Model',

    config: {
        fields: ['id', 'name', 'age', 'gender'],
        proxy: {
            type: 'rest',
            url : 'data/users',
            reader: {
                type: 'json',
                root: 'users'
            }
        }
    }
});

// Uses the User Model's Proxy
Ext.create('Ext.data.Store', {
    model: 'User'
});

这种定义模型的方式提供了两个好处。首先,由于使用 User 模型的每个存储区很可能需要以相同的方式加载其数据,因此我们避免了为每个存储区复制代理定义。其次,我们可以在不调用存储区的情况下加载和保存模型数据

// Gives us a reference to the User class
var User = Ext.ModelMgr.getModel('User');

var ed = Ext.create('User', {
    name: 'Ed Spencer',
    age : 25
});

// We can save Ed directly without having to add him to a Store first because we
// configured a RestProxy which will automatically send a POST request to the url /users
ed.save({
    success: function(ed) {
        console.log("Saved Ed! His ID is "+ ed.getId());
    }
});

// Load User 1 and do something with it (performs a GET request to /users/1)
User.load(1, {
    success: function(user) {
        console.log("Loaded user 1: " + user.get('name'));
    }
});

还有一些代理利用了 HTML5 的新功能——LocalStorageSessionStorage。虽然较旧的浏览器不支持这些新的 HTML5 API,但它们非常有用,很多应用程序将通过使用它们受益匪浅。

关联

可以使用关联 API 将模型链接在一起。大多数应用程序处理许多不同的模型,并且这些模型几乎总是相关的。博客创作应用程序可能具有用于用户、帖子和评论的模型。每个用户创建帖子,每个帖子接收评论。我们可以按以下示例所示表达这些关系

Ext.define('User', {
    extend: 'Ext.data.Model',
    config: {
        fields: ['id', 'name'],
        proxy: {
            type: 'rest',
            url : 'data/users',
            reader: {
                type: 'json',
                root: 'users'
            }
        },

        hasMany: 'Post' // shorthand for { model: 'Post', name: 'posts' }
    }
});

Ext.define('Comment', {
    extend: 'Ext.data.Model',

    config: {
        fields: ['id', 'post_id', 'name', 'message'],
        belongsTo: 'Post'
    }
});

Ext.define('Post', {
    extend: 'Ext.data.Model',

    config: {
        fields: ['id', 'user_id', 'title', 'body'],

        proxy: {
            type: 'rest',
            url : 'data/posts',
            reader: {
                type: 'json',
                root: 'posts'
            }
        },
        belongsTo: 'User',
        hasMany: { model: 'Comment', name: 'comments' }
    }
});

正如此示例所示,在应用程序中表达不同模型之间的丰富关系很容易。每个模型都可以与其他模型具有任意数量的关联,并且可以按任何顺序定义模型。一旦拥有模型实例,就可以轻松遍历关联数据。例如,要记录针对给定用户的每个帖子发表的所有评论,请使用以下示例中的代码

// Loads User with ID 1 and related posts and comments using User's Proxy
User.load(1, {
    success: function(user) {
        console.log("User: " + user.get('name'));

        user.posts().each(function(post) {
            console.log("Comments for post: " + post.get('title'));

            post.comments().each(function(comment) {
                console.log(comment.get('message'));
            });
        });
    }
});

我们在上面创建的每个 hasMany 关联都会自动向模型添加一个新函数。我们声明每个 User 模型都有许多帖子,这添加了上面代码段中使用的 user.posts() 函数。调用 user.posts() 会返回使用 Post 模型配置的存储区。反过来,Post 模型会获得一个 comments() 函数,因为我们已经设置了 hasMany Comments 关联。

关联不仅有助于加载数据,还可以用于创建新记录

user.posts().add({
    title: 'Ext JS 4.0 MVC Architecture',
    body: 'It\'s a great Idea to structure your Ext JS Applications using the built in MVC Architecture...'
});

user.posts().sync();

在此示例中,我们实例化了一个新 Post,然后调用 sync() 通过其配置的代理保存新 Post。这是一个异步操作,您可以向其传递回调,如果您希望在操作完成后收到通知。

belongsTo 关联还会在模型上生成新方法。以下示例显示如何使用该功能

// get the user reference from the post's belongsTo association
post.getUser(function(user) {
    console.log('Just got the user reference from the post: ' + user.get('name'));
});

// try to change the post's user
post.setUser(100, {
    callback: function(product, operation) {
        if (operation.wasSuccessful()) {
            console.log('Post\'s user was updated');
        } else {
            console.log('Post\'s user could not be updated');
        }
    }
});

同样,加载函数 (getUser) 是异步的,需要一个回调函数才能获取用户实例。然后,setUser 方法将外键 (在本例中为 user_id) 更新为 100 并保存 Post 模型。和往常一样,您可以传入回调,这些回调将在保存操作完成时触发,无论是否成功。

验证

模型具有丰富的支持来验证其数据。为了演示这一点,我们基于前面说明关联的示例。首先,让我们向 User 模型添加一些验证

Ext.define('User', {
    extend: 'Ext.data.Model',

    config: {
        fields: [
            // ...
        ],

        validations: [
            { type: 'presence',  field: 'name' },
            { type: 'length',    field: 'name', min: 5 },
            { type: 'format',    field: 'age', matcher: /\d+/ },
            { type: 'inclusion', field: 'gender', list: ['male', 'female'] },
            { type: 'exclusion', field: 'name', list: ['admin'] }
        ],

        proxy: [
            // ...
        ]
    }
});

验证遵循与字段定义相同的格式。在每种情况下,我们指定一个字段和一种验证类型。我们示例中的验证期望 name 字段存在且长度至少为五个字符,age 字段为数字,gender 字段为“male”或“female”,username 为除“admin”之外的任何内容。一些验证需要其他可选配置 - 例如,length 验证可以采用 min 和 max 属性,format 可以采用匹配器,依此类推。Sencha Touch 中内置了五种验证,添加自定义规则很容易。

内置了以下验证

  • presence 确保字段有值。零计为有效值,但空字符串不计。
  • length 确保字符串的长度介于最小值和最大值之间。两个约束都是可选的。
  • format 确保字符串与正则表达式格式匹配。在上面的示例中,我们确保 age 字段为数字。
  • inclusion 确保值在特定值集内(例如,我们确保 gender 为 male 或 female)。
  • exclusion 确保值不在特定值集内(例如,我们可以将用户名“admin”列入黑名单)。

现在我们已经了解了不同的验证,让我们使用它们来验证 User 实例。在以下示例中,我们创建一个用户实例并针对它运行验证,注意任何失败

// now lets try to create a new user with as many validation errors as we can
var newUser = Ext.create('User', {
    name: 'admin',
    age: 'twenty-nine',
    gender: 'not a valid gender'
});

// run some validation on the new user we just created
var errors = newUser.validate();

console.log('Is User valid?', errors.isValid()); // returns 'false' as there were validation errors
console.log('All Errors:', errors.items); // returns the array of all errors found on this model instance

console.log('Age Errors:', errors.getByField('age')); // returns the errors for the age field

这里的主要函数是 validate(),它运行所有配置的验证并返回一个 errors 对象。此简单对象是找到的任何错误的集合,加上一些方便的方法,例如 isValid(),如果任何字段没有错误,则返回 true,以及 getByField(),它返回给定字段的所有错误。

Sencha Touch 2.4