许多类在使用配置对象创建(实例化)类时都有快捷名称。快捷名称被称为 别名
(如果类扩展了 Ext.Component,则称为 xtype
)。别名/xtype 列在适用类的类名旁边,以便快速参考。
框架类或其成员可以指定为 private
或 protected
。否则,类/成员为 public
。Public
、protected
和 private
是访问描述符,用于传达类或类成员应如何以及何时使用。
Public 类和类成员可供任何其他类或应用程序代码使用,并且在主要产品版本中可以被认为是稳定和持久的。Public 类和成员可以通过子类安全地扩展。
Protected 类成员是稳定的 public
成员,旨在由拥有类或其子类使用。Protected 成员可以通过子类安全地扩展。
Private 类和类成员由框架内部使用,不供应用程序开发人员使用。Private 类和成员可能会随时更改或从框架中省略,恕不另行通知,并且不应在应用程序逻辑中依赖它们。
static
标签。*见下面的静态。下面是一个类成员示例,我们可以剖析它以显示类成员的语法(在本例中是从 Ext.button.Button 类查看的 lookupComponent 方法)。
让我们看看成员行的每个部分
lookupComponent
)( item )
)Ext.Component
)。对于不返回除 undefined
之外任何内容的方法,或者可能显示为由正斜杠 /
分隔的多个可能值,表示返回的内容可能取决于方法调用的结果(即,如果 get 方法调用成功,则方法可能返回 Component,如果失败,则返回 false
,这将显示为 Ext.Component/Boolean
)。PROTECTED
- 请参阅下面的标志部分)Ext.container.Container
)。如果成员源自当前类,则源类将显示为蓝色链接;如果成员从祖先类或混入类继承,则显示为灰色链接。view source
)item : Object
)。undefined
之外的值,则“返回值”部分将注释返回的类或对象类型以及描述(示例中为 Ext.Component
)Available since 3.4.0
- 示例中未显示),紧随成员描述之后Defaults to: false
)API 文档使用许多标志来进一步传达类成员的功能和意图。标签可以用文本标签、缩写或图标表示。
classInstance.method1().method2().etc();
false
,则标记为可阻止的事件将不会触发- 表示框架类
- Singleton 框架类。*有关更多信息,请参阅 singleton 标志
- 组件类型的框架类(Ext JS 框架中扩展 Ext.Component 的任何类)
- 表示类、成员或指南在当前查看的版本中是新的
- 表示 config
类型的类成员
- 表示 property
类型的类成员
- 表示 method
类型的类成员
- 表示 event
类型的类成员
- 表示 theme variable
类型的类成员
- 表示 theme mixin
类型的类成员
- 表示类、成员或指南在当前查看的版本中是新的
在 API 文档页面上的类名正下方是一行按钮,对应于当前类拥有的成员类型。每个按钮显示按类型划分的成员计数(此计数在应用过滤器后会更新)。单击按钮将导航到该成员部分。将鼠标悬停在成员类型按钮上将显示该类型的所有成员的弹出菜单,以便快速导航。
与类配置选项相关的 Getter 和 setter 方法将显示在方法部分以及 API 文档和成员类型菜单的配置部分中,紧挨着它们所处理的配置下方。Getter 和 setter 方法文档将在配置行中找到,以便于参考。
您的页面历史记录保存在本地存储中,并显示在顶部标题栏下方(使用可用的实际空间)。默认情况下,显示的唯一搜索结果是与您当前查看的产品/版本匹配的页面。您可以通过单击历史记录栏右侧的 按钮并选择“全部”单选选项来扩展显示的内容。这将显示所有产品/版本在历史记录栏中的所有最近页面。
在历史记录配置菜单中,您还将看到最近访问页面的列表。结果按“当前产品/版本”和“全部”单选选项进行过滤。单击 按钮将清除历史记录栏以及本地存储中保存的历史记录。
如果在历史记录配置菜单中选择“全部”,则“在历史记录栏中显示产品详细信息”复选框选项将启用。选中后,每个历史页面的产品/版本将与历史记录栏中的页面名称一起显示。将光标悬停在历史记录栏中的页面名称上方也会将产品/版本显示为工具提示。
可以使用页面顶部的搜索字段搜索 API 文档和指南。
在 API 文档页面上,还有一个过滤器输入字段,该字段使用过滤器字符串过滤成员行。除了按字符串过滤外,您还可以按访问级别、继承和只读来过滤类成员。这是通过使用页面顶部的复选框完成的。
API 类导航树底部的复选框过滤类列表,以包括或排除私有类。
单击空的搜索字段将显示您最近 10 次搜索,以便快速导航。
每个 API 文档页面(JavaScript 原始类型页面除外)都有一个与该类相关的元数据菜单视图。此元数据视图将具有以下一项或多项
Ext.button.Button
类具有 Ext.Button
的备用类名)。备用类名通常是为了向后兼容而维护的。可运行的示例 (Fiddles) 默认在页面上展开。您可以使用代码块左上角的箭头单独折叠和展开示例代码块。您还可以使用页面右上角的切换按钮切换所有示例的折叠状态。切换所有状态将在页面加载之间记住。
类成员默认在页面上折叠。您可以使用成员行左侧的箭头图标或全局使用右上角的展开/折叠所有切换按钮来展开和折叠成员。
在较窄的屏幕或浏览器上查看文档将导致针对较小外形尺寸优化的视图。桌面视图和“移动”视图之间的主要区别在于
可以通过单击 API 文档页面顶部的类名来查看类源代码。可以通过单击成员行右侧的“查看源代码”链接来查看类成员的源代码。
从用户的角度来看,您的应用程序只是一组视图的集合。尽管应用程序的大部分价值在于模型和控制器,但用户直接与视图交互。在本指南中,我们将了解如何创建构建应用程序的视图。
创建视图的最简单方法是使用 Ext.create 和现有组件。例如,如果我们想要创建一个简单的 Panel,并在其中包含一些 HTML,我们可以使用以下代码
Ext.create('Ext.Panel', {
html: 'Welcome to my app',
fullscreen: true
});
此示例创建一个 Panel,其中包含一些 html 内容,并使其填充屏幕。虽然您可以创建任何内置组件,但最佳实践是创建具有您的特殊化的子类,然后按如下方式实例化该类
Ext.define('MyApp.view.Welcome', {
extend: 'Ext.Panel',
config: {
html: 'Welcome to my app',
fullscreen: true
}
});
Ext.create('MyApp.view.Welcome');
结果是相同的,但这次我们有了一个新的组件,我们可以创建任意次数。这是我们在构建应用程序时通常要遵循的模式 - 创建现有组件的子类,然后在以后创建它的实例。让我们看看这些变化
Ext.Panel 上可用的任何配置选项都可以在我们新类的 config 块中指定,或者在我们创建类实例时指定。定义子类时,请确保使用 config 对象;创建时,只需传入一个对象即可。
例如,以下代码基于之前的代码,但在 Ext.create 调用中传入了额外的配置
Ext.define('MyApp.view.Welcome', {
extend: 'Ext.Panel',
config: {
html: 'Welcome to my app',
fullscreen: true
}
});
Ext.create('MyApp.view.Welcome', {
styleHtmlContent: true
});
以下示例说明了我们的 Twitter 应用程序中的一个 View 类
Ext.define('Twitter.view.SearchBar', {
extend: 'Ext.Toolbar',
xtype : 'searchbar',
requires: ['Ext.field.Search'],
config: {
ui: 'searchbar',
layout: 'vbox',
cls: 'big',
items: [
{
xtype: 'title',
title: 'Twitter Search'
},
{
xtype: 'searchfield',
placeHolder: 'Search...'
}
]
}
});
此代码示例遵循与之前相同的模式 - 我们创建了一个名为 Twitter.view.SearchBar 的新类,它扩展了框架的 Ext.Toolbar 类。我们还传入了一些配置选项,包括布局和一个 items 数组。
在此示例中,我们使用了以下新选项
requires - 因为我们在 items 数组中使用了 searchfield,所以我们指示新视图需要 Ext.field.Search 类。目前,动态加载系统无法识别由 xtype 指定的类,因此我们需要手动定义依赖项
xtype - 为我们的新类提供自己的 xtype,允许我们在配置对象中轻松创建它,这类似于 searchfield 采用的方法
这允许我们以几种方式创建新视图类的实例
//creates a standalone instance
Ext.create('Twitter.view.SearchBar');
//alternatively, use xtype to create our new class inside a Panel
Ext.create('Ext.Panel', {
html: 'Welcome to my app',
items: [
{
xtype: 'searchbar',
docked: 'top'
}
]
});
Sencha Touch 广泛使用配置系统来提供可预测的 API 并保持代码的简洁性和易于测试性。我们强烈建议您在自己的类中也这样做。
让我们假设您想要创建一个图像查看器,当您点击图像时,它会弹出有关图像的信息。我们的设计目标是创建一个可重用的视图,可以使用图像 url、其标题和描述进行配置,并在您点击它时显示标题和描述。
大多数围绕显示图像的工作都由 Ext.Img 组件为我们处理,因此我们按如下方式对其进行子类化
Ext.define('MyApp.view.Image', {
extend: 'Ext.Img',
config: {
title: null,
description: null
},
//sets up our tap event listener
initialize: function() {
this.callParent(arguments);
this.element.on('tap', this.onTap, this);
},
//this function is called whenever you tap on the image
onTap: function() {
Ext.Msg.alert(this.getTitle(), this.getDescription());
}
});
//creates a full screen tappable image
Ext.create('MyApp.view.Image', {
title: 'Orion Nebula',
description: 'The Orion Nebula is rather pretty',
src: 'http://apod.nasa.gov/apod/image/1202/oriondeep_andreo_960.jpg',
fullscreen: true
});
在此示例中,我们为我们的类添加了两个额外的配置 - title 和 description - 它们都以 null 开头。当我们创建新类的实例时,我们像任何其他配置一样传入 title 和 description 配置。
新行为发生在 initialize 和 onTap 函数中。由于每次实例化任何组件时都会调用 initialize 函数,因此它是设置行为(如事件侦听器)的好地方。首先,我们使用 this.callParent(arguments) 以确保调用超类的 initialize 函数。这非常重要,省略此行可能会导致您的组件行为不正确。
在 callParent 之后,我们向组件的元素添加一个 tap 侦听器,每当元素被点击时,它都会调用 onTap 函数。Sencha Touch 中的所有组件都有一个 element 属性,您可以以这种方式使用它来侦听 DOM 对象上的事件,添加或删除样式,或者执行您通常对 Ext.dom.Element 执行的任何其他操作。
onTap 函数本身使用 Ext.Msg.alert 来弹出一些关于图像的信息。请注意,我们的两个新配置 - title 和 description - 都接收生成的 getter 函数(分别为 getTitle 和 getDescription),以及生成的 setter 函数(setTitle 和 setDescription)。
当您为类创建新的配置选项时,getter 和 setter 函数会自动为您生成。例如,以下示例中名为 'border' 的配置会自动获得 getBorder 和 setBorder 函数
Ext.define('MyApp.view.MyView', {
extend: 'Ext.Panel',
config: {
border: 10
}
});
var view = Ext.create('MyApp.view.MyView');
alert(view.getBorder()); //alerts 10
view.setBorder(15);
alert(view.getBorder()); //now alerts 15
getter 和 setter 不是唯一生成的函数,还有几个函数使组件作者的生活更加简单 - applyBorder 和 updateBorder
Ext.define('MyApp.view.MyView', {
extend: 'Ext.Panel',
config: {
border: 0
},
applyBorder: function(value) {
return value + "px solid red";
},
updateBorder: function(newValue, oldValue) {
this.element.setStyle('border', newValue);
}
});
每当设置或更改 border 配置时(包括首次实例化组件时),都会在内部调用 applyBorder 函数。这是放置任何转换输入值的代码的最佳位置。在本例中,我们获取传入的边框宽度并返回 CSS 边框规范字符串。
这意味着当我们将视图的 border 配置设置为 10 时,我们的 applyBorder 函数将确保我们将该值转换为 '10px solid red'。apply 函数是可选的,但请注意,您必须从中 返回 一个值,否则什么都不会发生。
updateBorder 函数在 applyBorder 函数转换值后调用,通常用于修改 DOM、发送 AJAX 请求或执行任何其他类型的处理。在我们的例子中,我们获取视图的元素并使用 setStyle 更新边框样式。这意味着每次调用 setBorder 时,DOM 都会立即更新以反映新样式。
以下代码是新视图在操作中的示例。单击代码编辑器按钮以查看源代码 - 基本上我们创建了新视图的实例,并在顶部停靠了一个 spinner,允许我们通过点击 spinner 按钮来更改边框宽度。然后,我们挂钩到 Spinner 的 spin 事件,并从那里调用我们视图的新 setBorder 函数
//as before
Ext.define('MyApp.view.MyView', {
extend: 'Ext.Panel',
config: {
border: 0
},
applyBorder: function(value) {
return value + "px solid red";
},
updateBorder: function(newValue, oldValue) {
this.element.setStyle('border', newValue);
}
});
//create an instance of MyView with a spinner field that updates the border config
var view = Ext.create('MyApp.view.MyView', {
border: 5,
fullscreen: true,
styleHtmlContent: true,
html: 'Tap the spinner to change the border config option',
items: {
xtype: 'spinnerfield',
label: 'Border size',
docked: 'top',
value: 5,
minValue: 0,
maxValue: 100,
increment: 1,
listeners: {
spin: function(spinner, value) {
view.setBorder(value);
}
}
}
});
我们建议大多数 Sencha Touch 应用程序遵循 MVC 约定,以便您的代码保持良好组织和可重用性。作为 MVC 中的“V”,视图也适合此结构。MVC 中关于视图的约定非常简单,并且直接遵循我们之前示例中使用的命名约定。
MyApp.view.MyView 类应在名为 app/view/MyView.js 的文件中定义
这允许应用程序自动查找和加载它。如果您还不熟悉基于 MVC 的 Sencha Touch 应用程序的文件结构,它非常简单 - 应用程序只是一个 html 文件,一个 app.js 文件,以及一组模型、视图和控制器,存储在 app/model、app/view 和 app/controller 目录中
index.html app.js app/
controller/
model/
view/
MyView.js
您可以创建任意数量的视图,并在 app/view 目录中组织它们。通过在 app.js 文件中指定应用程序的视图,它们会自动加载
//contents of app.js
Ext.application({
name: 'MyApp',
views: ['MyView'],
launch: function() {
Ext.create('MyApp.view.MyView');
}
});
通过遵循简单的视图命名约定,您可以轻松地在应用程序中加载和创建视图类的实例。之前的示例正是这样做的 - 它加载 MyView 类并在应用程序启动函数中创建它的实例。要了解有关在 Sencha Touch 中编写 MVC 应用程序的更多信息,请参阅 应用程序入门指南。