许多类在使用配置对象创建(实例化)类时都有快捷名称。快捷名称被称为 alias
(别名)(如果类扩展自 Ext.Component,则为 xtype
)。别名/xtype 列在适用类的类名称旁边,以便快速参考。
框架类或其成员可以指定为 private
(私有的)或 protected
(受保护的)。否则,类/成员是 public
(公共的)。Public
、protected
和 private
是访问描述符,用于传达类或类成员应如何以及何时使用。
公共的 类和类成员可供任何其他类或应用程序代码使用,并且在主要产品版本中可以作为稳定和持久的依赖项。公共类和成员可以通过子类安全地扩展。
受保护的 类成员是稳定的 public
成员,旨在由拥有类或其子类使用。受保护的成员可以通过子类安全地扩展。
私有的 类和类成员在框架内部使用,不供应用程序开发人员使用。私有类和成员可能随时更改或从框架中省略,恕不另行通知,并且不应在应用程序逻辑中依赖它们。
static
标签。*请参阅下面的静态。下面是一个类成员示例,我们可以对其进行剖析,以展示类成员的语法(在本例中是从 Ext.button.Button 类查看的 lookupComponent 方法)。
让我们看看成员行的每个部分
lookupComponent
)( item )
)Ext.Component
)。对于除 undefined
以外不返回任何内容的方法,可以省略此项,或者可以显示为以正斜杠 /
分隔的多个可能值,表示返回的内容可能取决于方法调用的结果(即,如果 get 方法调用成功,方法可能返回 Component,如果失败,则返回 false
,这将显示为 Ext.Component/Boolean
)。PROTECTED
- 请参阅下面的标志部分)Ext.container.Container
)。如果成员源自当前类,则源类将显示为蓝色链接;如果它从祖先类或混合类继承,则显示为灰色。查看源代码
)item : Object
)。undefined
以外的值,则“返回值”部分将注释返回的类或对象类型以及描述(示例中为 Ext.Component
)Available since 3.4.0
- 示例中未显示),紧接在成员描述之后Defaults to: false
)API 文档使用许多标志来进一步传达类成员的功能和意图。标签可以用文本标签、缩写或图标表示。
classInstance.method1().method2().etc();
false
,则标记为可阻止的事件将不会触发- 表示框架类
- 单例框架类。*有关更多信息,请参阅单例标志
- 组件类型框架类(Ext JS 框架中扩展自 Ext.Component 的任何类)
- 表示类、成员或指南在当前查看的版本中是新的
- 表示 config
类型的类成员
- 表示 property
类型的类成员
- 表示 method
类型的类成员
- 表示 event
类型的类成员
- 表示 theme variable
类型的类成员
- 表示 theme mixin
类型的类成员
- 表示类、成员或指南在当前查看的版本中是新的
在 API 文档页面上的类名称正下方是一行按钮,对应于当前类拥有的成员类型。每个按钮显示按类型划分的成员计数(此计数会随着过滤器的应用而更新)。单击按钮将导航到该成员部分。将鼠标悬停在成员类型按钮上将显示该类型的所有成员的弹出菜单,以便快速导航。
与类配置选项相关的 Getter 和 Setter 方法将显示在方法部分以及 API 文档和成员类型菜单的 config 部分中,就在它们所作用的 config 下方。Getter 和 Setter 方法文档将在 config 行中找到,以便于参考。
您的页面历史记录保存在本地存储中,并显示在顶部标题栏正下方(使用可用的实际空间)。默认情况下,显示的唯一搜索结果是与您当前查看的产品/版本匹配的页面。您可以通过单击历史记录栏右侧的 按钮并选择“全部”单选选项来扩展显示的内容。这将显示所有产品/版本的所有最近页面历史记录栏。
在历史记录配置菜单中,您还将看到最近访问页面的列表。结果按“当前产品/版本”和“全部”单选选项过滤。单击 按钮将清除历史记录栏以及本地存储中保存的历史记录。
如果在历史记录配置菜单中选择“全部”,则“在历史记录栏中显示产品详细信息”的复选框选项将启用。选中后,每个历史页面的产品/版本将与历史记录栏中的页面名称一起显示。将光标悬停在历史记录栏中的页面名称上也会将产品/版本显示为工具提示。
可以使用页面顶部的搜索字段搜索 API 文档和指南。
在 API 文档页面上,还有一个过滤器输入字段,该字段使用过滤器字符串过滤成员行。除了按字符串过滤外,您还可以按访问级别、继承和只读来过滤类成员。这可以通过页面顶部的复选框完成。
API 类导航树底部的复选框过滤类列表,以包含或排除私有类。
单击空的搜索字段将显示您最近 10 次搜索,以便快速导航。
每个 API 文档页面(Javascript 原始类型页面除外)都有一个与该类相关的元数据菜单视图。此元数据视图将具有以下一项或多项
Ext.button.Button
类具有 Ext.Button
的备用类名称)。备用类名称通常为了向后兼容性而维护。可运行的示例 (Fiddles) 默认在页面上展开。您可以使用代码块左上角的箭头单独折叠和展开示例代码块。您还可以使用页面右上角的切换按钮切换所有示例的折叠状态。切换所有状态将在页面加载之间记住。
类成员默认在页面上折叠。您可以使用成员行左侧的箭头图标或全局使用右上角的展开/折叠全部切换按钮来展开和折叠成员。
在较窄的屏幕或浏览器上查看文档将导致针对较小外形尺寸优化的视图。桌面视图和“移动”视图之间的主要区别在于
可以通过单击 API 文档页面顶部的类名称来查看类源代码。可以通过单击成员行右侧的“查看源代码”链接来查看类成员的源代码。
DataView 使您可以轻松地动态创建许多组件,通常基于 store。它用于呈现来自服务器后端或任何其他数据源的数据,并为 list 等组件提供支持。
当您想要重复显示相同组件的集合时,可以使用 dataView,例如在以下情况下
最简单的情况是,dataView 是一个包含数据的 store 和一个用于呈现每个 store 项目的模板,如下例所示
在此示例中,我们内联定义了 store,因此所有数据都是本地的,因此不必从服务器加载。对于 store 中定义的每个数据项,dataView 都会呈现一个 div 并传入名称和年龄数据。该 div 使用指定的 itemTpl 并在花括号占位符内呈现数据。
因为 dataView 与 store 集成,所以对 store 的任何更改都会立即反映在屏幕上。例如,如果我们在 store 中添加了一个新记录,它将被呈现到我们的 dataView 中
touchTeam.getStore().add({
name: 'Liz Lemmons',
age: 33
});
在添加如上一个代码示例中所示的新记录之后,我们不必手动更新 dataView,因为它会自动更新。如果我们修改 store 中的现有记录之一,也会发生同样的情况
touchTeam.getStore().getAt(0).set('age', 42);
这将获取 store 中的第一个记录,并将年龄更改为 42,并自动更新屏幕内容。
我们通常希望从服务器或其他 Web 服务加载数据,这样我们就不必在本地硬编码数据内容。假设我们想要将最新的 Sencha 论坛主题加载到 dataView 中,并为每个主题呈现主题标题。为此,我们需要修改 dataView store 和 itemTpl,如下所示
在此示例中,dataView 不再包含数据项,而是我们提供了一个 proxy,用于获取数据。在本例中,我们使用了 JSON-P 代理,该代理使用 Sencha 的 JSON-P 论坛结果加载数据。我们还为每个主题指定了标题,并使用 Store 的 autoLoad 配置自动加载数据。最后,我们配置了一个 Reader 来解码来自 Sencha.com 的响应,指示它期望 JSON,并且在 JSON 响应的“topics”部分找到主题。
您可能已经意识到,尽管我们的 dataView 正在显示来自 store 的数据,但它没有任何默认样式。缺少默认样式是故意的,但添加自定义 CSS 非常简单。dataView 有两个配置支持将您的自定义 CSS 定位到视图:baseCls 和 itemCls。baseCls 用于在 dataView 的外部元素周围添加 className
。您提供的 itemCls 将添加到呈现到我们的 dataView 中的每个项目中。
如果您没有指定 itemCls,它会自动采用 baseCls 配置(默认为 x-dataview
)并在其前面加上 -item
。因此,每个项目都将具有 x-dataview-item
的 className。
在添加配置之前,我们需要创建以下示例中显示的自定义 CSS
.my-dataview-item {
background: #ddd;
padding: 1em;
border-bottom: 1px solid #ccc;
}
.my-dataview-item img {
float: left;
margin-right: 1em;
}
.my-dataview-item h2 {
font-weight: bold;
}
CSS 完成后,我们可以回到我们之前的 JSONP 示例并添加 baseCls 配置
Ext.create('Ext.DataView', {
fullscreen: true,
store: store,
itemTpl: '<p>{title}</p>',
baseCls: 'my-dataview',
//As described above, we don't need to set itemCls in most
//cases as it will already add a className
//generated from the baseCls to each item.
//itemCls: 'my-dataview-item'
});
在之前的示例中,我们创建了一个带有 dataView 的 itemTpl,这意味着每个项目都从 XTemplate 呈现为基本 div。但是,有时您需要每个项目都是一个组件,以便您可以为用户提供丰富的 UI。在 Sencha Touch 中,我们引入了 useComponents 配置,允许您解决这种情况。
创建组件 dataView 与创建之前显示的基于模板的普通 dataView 非常相似,但是您必须定义在呈现列表中的每个项目时使用的项目视图。store 的每个记录都将转换为 dataItem,它扩展自 container,因此您可以在其中包含多个组件。在此示例中,我们使用自定义 updateRecord 方法实现,该方法根据数据值更新 DataItems 的组件
另一个更高级的示例,使用 datamap
Ext.define('MyListItem', {
extend: 'Ext.dataview.component.DataItem',
requires: ['Ext.Button'],
xtype: 'mylistitem',
config: {
nameButton: true,
dataMap: {
getNameButton: {
setText: 'name'
}
}
},
applyNameButton: function(config) {
return Ext.factory(config, Ext.Button, this.getNameButton());
},
updateNameButton: function(newNameButton, oldNameButton) {
if (oldNameButton) {
this.remove(oldNameButton);
}
if (newNameButton) {
this.add(newNameButton);
}
}
});
此示例演示如何定义基于组件的 dataView 项目组件。关于此示例,有几个重要的注意事项
我们必须为每个项目扩展 dataItem。这是一个抽象类,用于处理每个项目的记录处理。
在 extend 代码之后,我们需要项目组件内部的 Ext.Button。
我们为此项目组件指定 xtype
。
在 config 块内部,我们定义 nameButton
项目。添加到组件的此自定义配置将通过类系统转换为 button。默认情况下,我们将其设置为 true
,但这也可以是一个配置块。此配置会自动为 nameButton
项目生成 getter 和 setter。
我们定义 datamap。dataMap 是 model 的数据与此视图之间的映射。getNameButton
是您要更新的实例的 getter;所以在这种情况下,我们想要获取此组件的 nameButton
配置。在该块内部,我们然后为其提供该实例的 setter,在本例中为 setText
,并为其提供我们正在传递的记录的字段。因此,一旦此项目组件获得记录,它就会获得 nameButton
,然后使用记录的 name
值调用 setText
。
最后,我们定义 nameButton
项目的 apply 方法。apply 方法使用 factory。然后返回该实例,然后导致调用 updateNameButton
。updateNameButton
方法删除旧的 nameButton 实例(如果存在),并添加新的 nameButton 实例。
创建项目组件后,我们可以创建组件 dataview,类似于之前的示例。
Ext.create('Ext.DataView', {
fullscreen: true,
store: {
fields: ['name', 'age'],
data: [
{name: 'Greg', age: 100},
{name: 'Brandon', age: 21},
{name: 'Scott', age: 21},
{name: 'Gary', age: 24},
{name: 'Fred', age: 24},
{name: 'Seth', age: 26},
{name: 'Kevin', age: 26},
{name: 'Israel', age: 26},
{name: 'Mitch', age: 26}
]
},
useComponents: true,
defaultType: 'mylistitem'
});
此代码有两个关键添加项。首先,我们添加了 useComponents 配置并将其设置为 true
。其次,我们将 defaultType 配置设置为之前创建的 mylistitem
项目组件。这告诉 dataview 将定义的项目组件用作每个项目的视图。
如果我们一起运行此代码,我们可以看到组件 dataview 正在运行。
这种方法的最大好处是它为您的 dataview 增加了灵活性。由于每个项目组件都可以访问其自己的 Ext.dataview.component.DataItem#record,因此您可以对其执行任何操作。
在以下示例中,我们向 nameButton
添加一个事件监听器,以监听 tap 事件,该事件会警告用户所选人员的年龄。
Ext.define('MyListItem', {
//...
updateNameButton: function(newNameButton, oldNameButton) {
if (oldNameButton) {
this.remove(oldNameButton);
}
if (newNameButton) {
// add an event listeners for the `tap` event onto the new button, and
// tell it to call the onNameButtonTap method
// when it happens
newNameButton.on('tap', this.onNameButtonTap, this);
this.add(newNameButton);
}
},
onNameButtonTap: function(button, e) {
var record = this.getRecord();
Ext.Msg.alert(
record.get('name'), // the title of the alert
"The age of this person is: " + record.get('age')
// the message of the alert
);
}
});
最后,在将此代码添加到我们之前的示例之后,我们得到了以下最终结果