许多类都有快捷名称,用于在使用配置对象创建(实例化)类时。快捷名称称为别名
(如果类扩展 Ext.Component,则称为xtype
)。对于适用的类,别名/xtype 会列在类名称旁边以供快速参考。
框架类或其成员可以指定为私有
或受保护
。否则,类/成员为公共
。公共
、受保护
和私有
是访问描述符,用于传达如何以及何时使用类或类成员。
公共类和类成员可供任何其他类或应用程序代码使用,并且可以作为主要产品版本中稳定的持久性。公共类和成员可以通过子类安全地扩展。
受保护类成员是稳定的公共
成员,旨在供拥有类或其子类使用。受保护的成员可以通过子类安全地扩展。
私有类和类成员由框架内部使用,不打算供应用程序开发人员使用。私有类和成员可能会在任何时候在不发出通知的情况下更改或从框架中省略,并且不应在应用程序逻辑中依赖它们。
静态
标签。*请参见下面的静态。下面是一个示例类成员,我们可以对其进行剖析以显示类成员的语法(在本例中,是从 Ext.button.Button 类查看的 lookupComponent 方法)。
我们来看一下成员行的每一部分
lookupComponent
)( item )
)Ext.Component
)。对于不返回除 undefined
之外的任何内容的方法,可以省略此项,或者可能显示用正斜杠 /
分隔的多个可能值,表示返回的内容可能取决于方法调用的结果(即,如果 get 方法调用成功,方法可能返回 Component,如果失败,则返回 false
,将显示为 Ext.Component/Boolean
)。PROTECTED
- 请参见下面的标志部分)Ext.container.Container
)。如果成员源自当前类,则源类将显示为蓝色链接;如果从祖先或混合类继承,则显示为灰色。查看源
)item : Object
)列出。undefined
之外的值,“返回”部分将记录返回的类或对象类型以及描述(示例中的 Ext.Component
)自 3.4.0 起可用
- 示例中未显示)默认为:false
)API 文档使用许多标志来进一步传达类成员的功能和意图。标签可以用文本标签、缩写或图标表示。
classInstance.method1().method2().etc();
false
,则标记为可阻止的事件将不会触发- 表示框架类
- 单例框架类。*有关更多信息,请参见单例标志
- 组件类型框架类(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
)。备用类名通常用于向后兼容。默认情况下,可运行示例(Fiddle)在页面上展开。你可以使用代码块左上角的箭头单独折叠和展开示例代码块。你还可以使用页面右上角的切换按钮切换所有示例的折叠状态。页面加载之间会记住切换所有状态。
默认情况下,类成员在页面上折叠。你可以使用成员行左侧的箭头图标或全局使用展开/折叠所有切换按钮右上角来展开和折叠成员。
在较窄的屏幕或浏览器上查看文档将导致针对较小尺寸优化视图。桌面和“移动”视图之间的主要区别是
可以通过单击 API 文档页面顶部的类名来查看类源。可以通过单击成员行右侧的“查看源”链接来查看类成员的源。
从用户的角度来看,你的应用程序只是一组视图。尽管应用程序的很多价值在于模型和控制器,但用户直接与视图交互。在本指南中,我们将了解如何创建构建应用程序的视图。
创建视图的最简单方法是使用 Ext.create 和现有组件。例如,如果我们想创建一个带有内部 HTML 的简单面板,我们可以使用以下代码
Ext.create('Ext.Panel', {
html: 'Welcome to my app',
fullscreen: true
});
此示例创建一个带有 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 块中指定,也可以在我们创建类实例时指定。定义子类时,请确保使用 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 应用程序中的一个视图类
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 数组中使用了搜索字段,我们指示新视图需要 Ext.field.Search 类。目前,动态加载系统无法识别由 xtype 指定的类,因此我们需要手动定义依赖项
xtype - 为我们的新类提供其自己的 xtype,使我们能够轻松地在配置对象中创建它,这类似于使用搜索字段采用的方法
这使我们能够通过几种方式创建新视图类的实例
//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 之后,我们向组件的元素添加一个轻触侦听器,该侦听器在每次轻触元素时调用 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 函数是可选的,但请注意你必须返回一个值,否则不会发生任何事情。
在 applyBorder 函数转换值之后调用 updateBorder 函数,通常用于修改 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 应用程序,请参阅 应用程序指南简介。