登录
注册
关于我们
简体中文
ENGLISH
搜索
购物车
0 ITEMS ON YOUR CART
首页
动态
方案
案例
专栏
期刊
联系我们
首页
期刊
[Ext JS6] ViewControllers-视图控制器
Ext JS开发大全
第1章 Ext JS快速入门示例[4/4]
第12章[12.10]富文本编辑器 CKEditor与Ext JS的整合
第12章[12.10.1] Ext JS + CKEditor+Spring Boot 实现编辑器图片上传
第11章[11.6] Ext JS 自行搭建远端库的包升级版本后找不到的问题解决
[Ext JS 4] 实战之Grid, Tree Gird编辑
ext命令集
第12章[12.3] Ext JSGrid中的超链接列及其功能实现
[Ext JS]textfield添加compositionstart、compositionupdate 和compositionend _os
[Ext JS ] 动添切换字段的必填与非必填
3.1 Ext JS 组件总览
[Ext JS] Grid表格批量编辑的实现
Ext JS 快速开发工具
带触发器按钮的输入框
Ext JS的布尔对象类型处理及便捷方法
Ext JS的Object类型处理及便捷方法
ExtJS RadioGroup(单选按钮组) 使用及注意事项
Ext JS 模拟后端数据实现
ToolTip 实现全介绍
Ext JS下拉单选框(Combobox,TagFied)使用及疑难问题解决
Ext JS应用测试概览
Sencha Studio 监视工具( Inspect Tool)
Ext JS 4 升级指南
Ext JS 如何定义公用方法(单例类 or 静态方法)
Ext JS的模块化开发(Package)
Ext3 -- Form 实例。 用来migrate file 数据到DB用的
ExtJS 3 在Tab下加入Form 实例
Extjs Grid 中给已经添加过Filter的列增加标识
Extjs 实战之 Ext.tree.TreePanel Tree无法显示
Extjs弹出框的异步执行
Grid 动态该表列( reconfigure)的性能改善
Spring Boot Ext JS准前后端框架应用的会话(Session)处理
[Ext JS 4] Extjs 图表 Legend(图例)的分行与分列显示
[Ext JS 4] Extjs 之 initComponent 和 constructor的区别
[Ext JS 4] Grid 中的单元格添加Tooltip 的效果
[Ext JS 4] Grid 实战之分页功能
[Ext JS 4] Grid 组件
[Ext JS 4] MVC 应用程序框架
[Ext JS 4] MVC 应用程序框架
发布 [Ext JS 4] contentEL,renderTo, applyTo 释义与区别
[Ext JS 4] 动态加载
[Ext JS 4] 实战之 ComboBox 和 DateField (消失之解决办法)
[Ext JS 4] 实战之 Picker 和 Picker Field
[Ext JS 4] 实战之 带week(星期)的日期选择控件(二)
[Ext JS 4] 实战之 ComboBox 和 DateField 的点击事件在IE下失效
## [Ext JS 4] 实战之 带week(星期)的日期选择控件(三)
[Ext JS 4] 实战之 带week(星期)的日期选择控件
[Ext JS 4] 实战之Chart 坐标控制(单坐标,双坐标)
[Ext JS 4] 实战之Chart, Column Chart 定制颜色
[Ext JS 4] 实战之Grid, Tree Gird 动态添加列
[Ext JS 4] 实战之Grid, Tree Gird 动态添加列续(性能考虑)
[Ext JS 4] 实战之Grid, Tree Gird 动态添加行
[Ext JS 4] 实战之Grid, Tree Gird 添加按钮列
[Ext JS 4] 实战之Grid, Tree Gird编辑Cell
[Ext JS 4] 实战之Load Mask - 在Grid Reconfigure的使用状况
[Ext JS 4] 实战之Load Mask(加载遮罩)的显示与隐藏
[Ext JS 4] 实战之多选下拉单 (带checkbox) 续 - 带ALL 选项
[Ext JS 4] 实战之多选下拉单 (带checkbox)
[Ext JS 4] 实战之升级系列一[Ext jS 3-->Ext JS 4]
[Ext JS 4] 实战之将chart导出为png, jpg 格式的文件
[Ext JS 4] 实战之浏览器兼容
[Ext JS 4] 布局之实战二 - 中间区块不会自动伸展 (tab)续
[Ext JS 4] 组件之图表
[Ext JS 4]后台自动产生图档
[Ext JS 4]性能优化
[Ext JS 7 ]7.5 自适应配置 - Responsive Configs
[Ext JS 7] 关联(Association)
[Ext JS 7]事件(Event)
[Ext JS 7]ClassRequire错误解决
[Ext JS 7]的开发模式
[Ext JS 7]基于NPM的开发
[Ext JS ] 动添切换字段的必填与非必填
[Ext JS4] 数据包
[Ext JS4系列]Ext JS4 入门
[Ext JS6] Grid不同列的关联编辑
[Ext JS6] ViewControllers-视图控制器
[Ext JS6]Ext.Template
[Ext JS6]Sencha Cmd
[Ext JS6]编码规范
[Ext JS6]多类型设备开发
[Ext JS6]工作区-Workspace
[Ext JS6]路由(Routing)及使用
[Ext JS6]视图模型和数据绑定
[Ext JS6实战] Ajax获取Tree Store
[Ext JS6实战] Ext.XTemplate
[Ext JS6实战]动态数据绑定
[Ext JS] Sencha Cmd命令参考之二
[Ext JS] Sencha Cmd命令参考之一
[Ext JS] Group Grid-分组网格
[Ext JS] Group Grid-分组网格
[Ext JS]嵌套Grid的实现及注意事项
[Ext JS]SimXhr.js__dc=1659315492151_65 Uncaught TypeError问题分析与解决
[Ext JS]Sencha Studio安装与快速介绍之一
[Ext JS]textfield 添加 compositionstart、compositionupdate 和 compositionend
[Ext JS]图片显示方式
[ExtJS 6]Grid分页工具栏无效问题解决
[ExtJS6]ResponsiveColumn-自适应列布局
[Extjs 4] 类系统
基于Ext JS的模块化应用框架搭建及开发
[Ext JS] 自行搭建远端库的包升级版本后找不到的问题解决-The following versions are available
[Ext JS]鼠标移入移除时弹出和关闭窗口
[Ext JS]富文本编辑器 CKEditor与Ext JS的整合
[Ext JS]可编辑列Grid的全场景开发
['Ext JS]Grid中的超链接列及其功能实现
[Ext JS]Ext JS + CKEditor+Spring Boot 实现编辑器图片上传
[Ext JS]介绍与快速入门1
[Ext JS]实现带动态数字的图标
Spring Boot+Ext JS 实现图形验证码
Ext JS介绍与快速入门2
Ext JS开发基本环境准备与项目创建
[Ext JS]开发模式及快速测试方式
[Ext JS]多类型终端-电脑、移动端(手机、平板)
[Ext JS]基于Ext JS的MVC/MVVM架构的应用开发模式
[Ext JS]Ext JS的类与类体系
[Ext JS]Ext JS组件、容器与布局
[Ext JS]组件与容器的选择与开发
[Ext JS]Ext JS数据模型与数据封装
[Ext JS]Ext JS的控制器类型及使用
[Ext JS]说透Ext JS的窗口及对话框用法
[Ext JS]说透Ext JS的窗口及对话框用法
[Ext js]Grid行选择的多种场景和实现方式
[Ext JS]Ext JS类的继承与混合
CmsWing
[Ext JS6] ViewControllers-视图控制器
## [Ext JS6] ViewControllers-视图控制器 Ext JS 加入了ViewModels和 MVVM, 可以像MVC的 ViewController一样。这两种方式不相互排斥, 甚至可以混合使用。 ### 应用层级控制器 - Application-level Controllers 一个控制器继承自Ext.app.Controller, 这些控制器使用类似 CSS的选择器来查找组件和响应事件。也可以通过 refs 选择或获取组件实例。 这些控制器在应用启动的时候创建, 会在整个应用的生命周期中存在。控制器也可以管理多个视图的实例。 在大型项目中, 视图和控制器可能是有多个不同开发团队开发,最终集成到应用中。 要确保控制器仅对其相关的视图响应是比较困难的。另外, 开发人员通常希望在应用启动的时候限制控制器的数量。虽然可以通过一些方法懒加载控制器, 但是即使不需要它们也不会被销毁。 ### 视图控制器 - ViewControllers Ext JS5及之后版本向后兼容合法的应用层级控制器。引入了新的控制器类型Ext.app.ViewController, 解决了大型项目控制器的问题。 使用 “listeners”和 “reference”配置简化了和视图的连接 -利用视图的生命周期管理和其管理的视图控制器的生命周期 -基于一对一的视图管理关系降低了视图控制器的复杂性 -提供封装使嵌套视图可靠 -保留在关联视图下方的任何级别选择组件并收听其事件的功能。 ### 监听器 listeners 实例 View子项的监听配置实例 ```javascript Ext.define('MyApp.view.foo.Foo', { extend: 'Ext.panel.Panel', xtype: 'foo', controller: 'foo', items: [{ xtype: 'textfield', fieldLabel: 'Bar', listeners: { change: 'onBarChange' // no scope given here } }]}); ``` 在控制器中的配置: ```javascript Ext.define('MyApp.view.foo.FooController', { extend: 'Ext.app.ViewController', alias: 'controller.foo', onBarChange: function (barTextField) { // called by 'change' event }}); ``` 'onBarChange’没有指定范围, 则默认查找属于它自己的控制器。 安装经验, 监听配置是预留给组件创建者使用。所以视图如何监听自己的事件,还是由其基类触发的?答案是需要显示定义范围scope。 ```javascript Ext.define('MyApp.view.foo.Foo', { extend: 'Ext.panel.Panel', xtype: 'foo', controller: 'foo', listeners: { collapse: 'onCollapse', scope: 'controller' }, items: [{ ... }]}); ``` 上面使用了 Ext JS的两个新功能: 范围(scopes)和声明式监听 (declarative listeners)。 Scope的值可以是 this 和 controller。如果是 MVC的应用, 大部分使用controller。 因为View是一种类型的Ext.Component, 指定视图的 xtype,这样其他的视图就可以使用这种方式来创建。例如: ```javascript Ext.define('MyApp.view.bar.Bar', { extend: 'Ext.panel.Panel', xtype: 'bar', controller: 'bar', items: [{ xtype: 'foo', listeners: { collapse: 'onCollapse' } }]}); ``` ### 引用 - Reference 在完成控制器逻辑的时候, 常见的松散耦合的方式是获取需要的组件完成特定的动作, 类似: ```javascript Ext.define('MyApp.view.foo.Foo', { extend: 'Ext.panel.Panel', xtype: 'foo', controller: 'foo', tbar: [{ xtype: 'button', text: 'Add', handler: 'onAdd' }], items: [{ xtype: 'grid', ... }]}); Ext.define('MyApp.view.foo.FooController', { extend: 'Ext.app.ViewController', alias: 'controller.foo', onAdd: function () { // ... get the grid and add a record ... }}); ``` 如何获取组件, 比如上面的Grid组件, 最快的方式就是通过 配置的id使用 getCmp方法, 或者是 配置ItemId通过 refs或者是组件查找的方法, id查找不好的地方就是整个应用id及对应的DOM必须唯一。使用 itemId或者组件查找有弹性一点,但是需要通过查找的方式获取。 使用 reference?配置,可以简单的通过lookupReference的方式来获取。实例如下: ```javascript Ext.define('MyApp.view.foo.Foo', { extend: 'Ext.panel.Panel', xtype: 'foo', controller: 'foo', tbar: [{ xtype: 'button', text: 'Add', handler: 'onAdd' }], items: [{ xtype: 'grid', reference: 'fooGrid' ... }]}); Ext.define('MyApp.view.foo.FooController', { extend: 'Ext.app.ViewController', alias: 'controller.foo', onAdd: function () { var grid = this.lookupReference('fooGrid'); }}); ``` 这种方式和指定 itemId 之后通过this.down()的方式获取很类似。但是, 实现的引擎则有很大差异。 首先 reference?配置指示组件在其视图中组测自己(在这种情况下通过ViewController的存在来识别) 另外, lookupReference方法只是简单的咨询缓存是否需要刷新引用, 伪代码类似: ```javascript lookupReference: (reference) { var cache = this.references; if (!cache) { Ext.fixReferences(); // fix all references cache = this.references; // now the cache is valid } return cache[reference]; } ``` 也就是说, 这种方式没有搜索而且在容器中添加或是删除组件也是一次性调整, 除了性能上提升外,还有其他的好处。 ### 封装- Encapsulation 使用refs配置来查找很有弹性, 但是也存在一定风险。这个选择器虽然可以看到各个层级的组件,但是容易出错。举例来说, 一个控制器如果独立运行的话没有恩替, 但是导入其他的视图之后就会失败了。 使用监听和references?在ViewController?中这些问题就不在了。因为listeners 和 reference 配置仅仅定义在自己的ViewController中。 ViewController中有一个帮助方法:fireViewEvent ```javascript Ext.define('MyApp.view.foo.FooController', { extend: 'Ext.app.ViewController', alias: 'controller.foo', onAdd: function () { var record = new MyApp.model.Thing(); var grid = this.lookupReference('fooGrid'); grid.store.add(record); this.fireViewEvent('addrecord', this, record); }}); ``` 使用标准的监听器: ```javascript Ext.define('MyApp.view.bar.Bar', { extend: 'Ext.panel.Panel', xtype: 'bar', controller: 'bar', items: [{ xtype: 'foo', listeners: { collapse: 'onCollapse', addrecord: 'onAddRecord' } }]}); ``` ### 监听和事件域知识 生命周期 在大型应用中,一般是在首次需要的时候再动态创建控制器,这样可以减少系统加载的时间,提升系统性能。Ext JS早期版本的限制是只要创建就会一直存在, 无缝销毁和释放资源。同样,这也没有改变一个控制器有多个(或是没有)关联视图的现实。 ViewController 在组件生命周期很早就创建出来并绑定到视图的生命周期, 当视图销毁时, ViewController也一起销毁。这意味着不再强制ViewController管理没有视图或许多视图的状态。 一对一的关系意味着关联的追踪简单并且不容易发生销毁组件的泄漏。ViewController可以实现任何方法已经各生命周期点的任务: beforeInit?: 可以被重写。在组件initComponent?方法调用之前执行。这个方法在控制器创建完成之后就立即执行, 一般发生在组件构造器呼叫initConfig. init?: 视图调用initComponent?不久后调用。 initViewModel? - 在视图的ViewModel?创建的时候调用。 destroy?: 清除并返回资源, 一定要调用callParent
网站导航
首页
动态
方案
案例
专栏
期刊
联系我们