登录
注册
关于我们
简体中文
ENGLISH
搜索
购物车
0 ITEMS ON YOUR CART
首页
动态
方案
案例
专栏
期刊
联系我们
首页
期刊
[Ext JS6]视图模型和数据绑定
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]视图模型和数据绑定
## [Ext JS6]视图模型和数据绑定 ### ViewModel ViewModel是一个管理数据对象的类, 它运行对它感兴趣的组件绑定它并在变化的时候得到通知。ViewModel和ViewController一样,是属于某个 View的。子视图可以继承父的视图模型。 使用 bind的配置来绑定数据,当数据发生改变时,会调用对应的 setter方法。 ### 组件绑定 组件是数据绑定的主要方式。 绑定的配置需要有setter方法,比如Panel 的title配置,title有setTitle()方法, 所有可以绑定数据。 以width为例(有setWidth()方法) ```javascript Ext.create('Ext.panel.Panel', { title: 'Simple Form', viewModel: { type: 'test' // we will define the "test" ViewModel soon }, bind: { html: ' Hello {name}', width: '{someWidth}' }}); ``` 这里绑定的语法类似于Ext.Template。 如果绑定布尔类型的值的话, ```javascript bind: { hidden: '{!name}' // negated } ``` name也可是一个String类型。 绑定的优先级 数据绑定一般要优先于静态配置。 子组件的绑定 一个组件的所有子组件可以访问这个组件的 viewModel 看实例: ```javascript Ext.create('Ext.panel.Panel', { title: 'Simple Form', viewModel: { type: 'test' }, layout: 'form', defaultType: 'textfield', items: [{ fieldLabel: 'First Name', bind: '{firstName}' // uses "test" ViewModel from parent },{ fieldLabel: 'Last Name', bind: '{lastName}' }]}); ``` ### 双向绑定 双向绑定意味着视图和模型的数据实时同步。 视图的数据改变自动写到模型中。这回自动更新绑定到同一数据的其他组件。 需要注意的是并不是所有的配置都会将其更改发布到 ViewModel。 定义publish和twoWayBindable会将改动写回ViewModel。使用publishState方法也可以在组件和应用逻辑之间发布数据。 publish和twoWayBindable是组件的配置项。支持一个或多个属性。看个例子: View Model 实例效果如下: ![](/upload/picture/2022-10-09/upload_e8aa3e7fa143269760771d9e8d2a8c0d.png) 标题的显示和按钮是否显示会根据输入框的值动态改变。 也就是: 视图模型的值改变了, 会反应到视图上。 视图上的值进行修改, 视图模型的值也会修改。 绑定和组件状态 某些时候组件的状态, 类似checkbox是否选中或是 Gird中选择一行,对其他的组件会有影响。当一个组件有使用reference?来表示,这个组件会在视图模型中发布一些关键的属性。 ```javascript Ext.create('Ext.panel.Panel', { title : 'Login Form', width : 200, viewModel : { }, renderTo : Ext.getBody(), items : [ { xtype : 'checkbox', boxLabel : 'Manual Login', reference : 'manualLogin' }, { xtype : 'textfield', fieldLabel : 'User Name', bind : { disabled : '{!manualLogin.checked}' } } ] }); ``` 之上只有’Manual Login’这个复选框选中, 才可以在输入框中进行输入。 这里虽然viewModel中没有设置, 但是viewModel不能少, 好的做法是定义实际的viewModel类型。 #### 多值绑定 也可以绑定多个值 ```javascript Ext.create('Ext.Component', { bind: { data: { fname: '{firstName}', lname: '{lastName}' } }}); ``` #### 绑定记录 也可以绑定一个Store中的记录 ```javascript Ext.create('Ext.Component', { bind: { data: { reference: 'User', id: 42 } }}) ``` User是Ext.data.Session类型。 #### 关联绑定 ```javascript Ext.create('Ext.Component', { bind: { data: { reference: 'User', id: 42, association: 'address' } }}); ``` #### 绑定的选项设置 bindTo 绑定一个值后自动断开连接 ```javascript Ext.create('Ext.Component', { bind: { data: { bindTo: '{name}', single: true } }}); ``` deep-对象属性改变得到通知 ```javascript Ext.create('Ext.Component', { bind: { data: { bindTo: '{someObject}', deep: true } }}); ``` ### 视图模型公式 公式实例: ```javascript Ext.define('Osxm.view.FormulasViewMode', { extend: 'Ext.app.ViewModel', alias: 'viewmodel.formulavm', data:{ x:1, y:2 }, formulas: { x2y: function (get) { return get('x2') * get('y'); }, x2: function (get) { return get('x') * 2; } } });Ext.create('Ext.panel.Panel', { title : 'Formulas View Model', width : 200, viewModel : { type : 'formulavm' }, renderTo : Ext.getBody(), defaultType : 'textfield', items : [ { xtype : 'textfield', fieldLabel : 'x', bind : '{x}' } ,{ xtype : 'textfield', fieldLabel : 'y', bind : '{y}' } ,{ xtype : 'textfield', fieldLabel : 'x*2', bind : '{x2}' } ,{ xtype : 'textfield', fieldLabel : 'x*2*y', bind : '{x2y}' }] }); ``` 比较好的是使用显式绑定: ```javascript x3:{ bind: { x: '{x}', y: '{y}' }, get: function (data) { return data.x + data.y; //这里是字符串相加 } } ``` 双向公式 可以通过set方法实现双向公式, 类似: ```javascript Ext.define('MyApp.view.TestViewModel', { extend: 'Ext.app.ViewModel', alias: 'viewmodel.test', formulas: { name: { get: function (get) { var fn = get('firstName'), ln = get('lastName'); return (fn && ln) ? (fn + ' ' + ln) : (fn || ln || ''); }, set: function (value) { var space = value.indexOf(' '), split = (space < 0) ? value.length : space; this.set({ firstName: value.substring(0, split), lastName: value.substring(split + 1) }); } } }}); ``` ### 开发建议 为避免滥用和内存泄漏, 一些最佳实践: 使用 type来配置使用视图模型 ```javascript Ext.define('MyApp.view.TestView', { //... viewModel: { type: 'test' }, }); ``` 1.命名显而易见 2.不必要的话不要在对象中嵌套数据 3.使用子的视图模型,在组件需要的时候可以清理数据 4.非必要,不要创建子视图模型 5使用公式替换重复绑定 6.不要太深 7.公式需要稳定。
网站导航
首页
动态
方案
案例
专栏
期刊
联系我们