本文地址:http://blog.csdn.net/sushengmiyan/article/details/38612721

本文作者:sushengmiyan

-------------------------------------------------------------资源链接 -----------------------------------------------------------------------

翻译来源:http://docs.sencha.com/extjs/5.0/application_architecture/view_models_data_binding.html

API Docs:http://docs.sencha.com/extjs/5.0/apidocs/#!/api/Ext.app.ViewModel

------------------------------------------------------------------------------------------------------------------------------------------------

组件绑定

数据绑定(DataBinding)和视图模型(ViewModel)是Ext JS5 新增的强大特性。它们俩可以让你写最少的代码和使用声明类型的风格来帮助你解耦管理。

一个ViewModel就是一个类,这个类管理数据对象。它允许对数据感兴趣的组件来绑定它,并且当发生变化的时候会自动通知到。视图模型 (ViewModel)像ViewController一样是被视图View拥有的一个引用。因为视图模型(ViewModel)和视图有关系,在组件继 承关系中,祖先拥有的视图模型自雷也可以去连接。这就允许子类可以简单继承父类。

组件拥有一个bind配置属性,允许关联任何从ViewModel中来的配置数据。使用bind,你可以很确定的,组件配置的setter方法会在数值变化的时候自动绑定,不需要你自己写事件处理。

在本指南中,我们可以通过几个例子来了解一下ViewModels和DataBinding的强大功能。

或许最好的了解Binding和ViewModels的方法就是看你在组件上使用的不同的绑定方法。这是因为,组件是数据绑定的原始用户,组件是被Ext
JS的开发者熟知的。为了可以进行binding操作,我们需要先创建一个ViewModel以便于我们可以后期引入。

绑定和配置(Binding and Configs)

给组件绑定数据就是一个将Ext.app.ViewModel连接到组件的配置属性去的一个过程。只要有一个setter方法,任何组件的配置都可以被绑定,例如,在Ext.app.panerl.Panel类中有一个setTitle方法,你就可以绑定title配置。

下面的例子,我们给基于ViewModel的panel配置数据,我们可以讲我们的数据绑定到width因为有setWidth方法。

  1. Ext.create('Ext.panel.Panel', {
  2. title: 'Simple Form',
  3.  
  4. viewModel: {
  5. type: 'test' // 稍后定义test这个ViewModel
  6. },
  7.  
  8. bind: {
  9. html: '<p>Hello {name}</p>',
  10. width: '{someWidth}'
  11. }
  12. });

绑定数据用到的语法和Ext.Template是类似的,你可以江text文本放置在花括号里面,你也可以使用格式化fomatters。不像Ext.Template,当只传入一个像‘{someWidth}的时候不会被转化成字符串。

我们稍后会看到,name和somewidth是如何定义的。’上面的例子就是简单地展示了,数据是如何被组件使用的。

绑定布尔数据配置

像 可见性isible,可用性disable,选中状态checked还有按钮的按下状态pressed是需要配置布尔属性的。看下面的例子:

  1. Ext.create('Ext.panel.Panel', {
  2. title: 'Simple Form',
  3.  
  4. viewModel: {
  5. type: 'test'
  6. },
  7.  
  8. items: [{
  9. xtype: 'button',
  10. bind: {
  11. hidden: '{!name}' // negated
  12. }
  13. }]
  14. });

当按钮按下的时候,数值就被传入到setHidden方法中了,所以传入的是单个的时候,是不会被解释成字符串的,这就是一个原因。

绑定和优先级

绑定配置属性会覆盖之前静态定义的,但是也有可能就是会存在一点点的延迟。

  1. Ext.create('Ext.panel.Panel', {
  2. title: 'Simple Form',
  3.  
  4. viewModel: {
  5. type: 'test'
  6. },
  7.  
  8. bind: {
  9. title: 'Hello {name}'
  10. }
  11. });

一旦定义了name绑定,那么‘Simple Form’标题就会被替换。

绑定和子控件

绑定最有用的部分之一就是容器有的数据,子组件都可以获取。下面的例子,你可以看到,viewmodel的子组件绑定了父容器的数据。

  1. Ext.create('Ext.panel.Panel', {
  2. title: 'Simple Form',
  3.  
  4. viewModel: {
  5. type: 'test'
  6. },
  7.  
  8. layout: 'form',
  9. defaultType: 'textfield',
  10.  
  11. items: [{
  12. fieldLabel: 'First Name',
  13. bind: '{firstName}' // uses "test" ViewModel from parent
  14. },{
  15. fieldLabel: 'Last Name',
  16. bind: '{lastName}'
  17. }]
  18. });

绑定的两种方式

绑定属性也允许两种方式的绑定数据。在视图上修改的数据可以立刻返回到模型中。绑定到这个数据的组件都会被更新。

在上面的例子中,因为‘firstName’和‘lastname’属性石被text绑定的,在输入框中的变化会及时通知到后面的ViewModel,为了看清楚具体怎么连接的,我们有必要补充完成例子。

  1. Ext.define('TestViewModel', {
  2. extend: 'Ext.app.ViewModel',
  3.  
  4. alias: 'viewmodel.test', // connects to viewModel/type below
  5.  
  6. data: {
  7. firstName: 'John',
  8. lastName: 'Doe'
  9. },
  10.  
  11. formulas: {
  12. // We'll explain formulas in more detail soon.
  13. name: function (get) {
  14. var fn = get('firstName'), ln = get('lastName');
  15. return (fn && ln) ? (fn + ' ' + ln) : (fn || ln || '');
  16. }
  17. }
  18. });
  19.  
  20. Ext.define('TestView', {
  21. extend: 'Ext.panel.Panel',
  22. layout: 'form',
  23.  
  24. // Always use this form when defining a view class. This
  25. // allows the creator of the component to pass data without
  26. // erasing the ViewModel type that we want.
  27. viewModel: {
  28. type: 'test' // references alias "viewmodel.test"
  29. },
  30.  
  31. bind: {
  32. title: 'Hello {name}'
  33. },
  34.  
  35. defaultType: 'textfield',
  36. items: [{
  37. fieldLabel: 'First Name',
  38. bind: '{firstName}'
  39. },{
  40. fieldLabel: 'Last Name',
  41. bind: '{lastName}'
  42. },{
  43. xtype: 'button',
  44. text: 'Submit',
  45. bind: {
  46. hidden: '{!name}'
  47. }
  48. }]
  49. });
  50.  
  51. Ext.onReady(function () {
  52. Ext.create('TestView', {
  53. renderTo: Ext.getBody(),
  54. width: 400
  55. });
  56. });

当上面的面板被展示的时候,我们可以看到输入框中的变化被反射到面板的标题了,还可以看到提交按钮的状态。

绑定组件状态

有时候,组件的状态如选择框的checked或者表格的选中状态是其它组件关心的事情。当一个组件设置了reference去识别的时候,这个组件就在ViewModel中被大众化的。

在下面的例子中,我们有一个admin key输入框,状态呢是有选择框的选中状态决定的。这种行为时动态窗体适合的:

  1. Ext.create('Ext.panel.Panel', {
  2. title: 'Sign Up Form',
  3.  
  4. viewModel: {
  5. type: 'test'
  6. },
  7.  
  8. items: [{
  9. xtype: 'checkbox',
  10. boxLabel: 'Is Admin',
  11. reference: 'isAdmin'
  12. },{
  13. xtype: 'textfield',
  14. fieldLabel: 'Admin Key',
  15. bind: {
  16. disabled: '{!isAdmin.checked}'
  17. }
  18. }]
  19. });

绑定描述

到目前为止,我们可以看到三种基本的表格绑定描述:

{firstName}:这是直接从视图模型传过来的,没有被修改,可以是任何类型。

Hello{name}:可以插入字符

{!isAdmin.checked}可以使有负的标志,即 反,非得概念。

除了以上三种方法还有其他比较少用的方式

多绑定

  1. Ext.create('Ext.Component', {
  2. bind: {
  3. data: {
  4. fname: '{firstName}',
  5. lname: '{lastName}'
  6. }
  7. }
  8. });

绑定了firstname和lastname

绑定记录

像可以找到id=42的用户记录绑定

  1. Ext.create('Ext.Component', {
  2. bind: {
  3. data: {
  4. reference: 'User',
  5. id: 42
  6. }
  7. }
  8. });

这需要用到Ext.data.Session

关联绑定

看user的adress属性

  1. Ext.create('Ext.Component', {
  2. bind: {
  3. data: {
  4. reference: 'User',
  5. id: 42,
  6. association: 'address'
  7. }
  8. }
  9. });

在这个例子中,跟上面记录绑定是类似一样的。

绑定操作

下面展示了只绑定一次就销毁的例子。使用的single操作

  1. Ext.create('Ext.Component', {
  2. bind: {
  3. data: {
  4. bindTo: '{name}',
  5. single: true
  6. }
  7. }
  8. });

使用deep操作来绑定引用操作的更新

  1. Ext.create('Ext.Component', {
  2. bind: {
  3. data: {
  4. bindTo: '{someObject}',
  5. deep: true
  6. }
  7. }
  8. });

创建 视图模型ViewModels

上面了解了如何绑定,现在是时候学习ViewModel和它提供的功能了。

像之前表述的一样,ViewModel是管理底层数据的对象。

规则 Formulas

为了捆绑数据,视图模型提供了方便的方式去计算数据通过的就是formulas,者方便你在视图中只关注生命结构,不必关注数据依赖。

换句话说,通过这个Formulas数据可以在不修改的情况下显示不同的数值。

  1. Ext.define('TestViewModel2', {
  2. extend: 'Ext.app.ViewModel',
  3.  
  4. alias: 'viewmodel.test2',
  5.  
  6. formulas: {
  7. x2y: function (get) {
  8. return get('x2') * get('y');
  9. },
  10.  
  11. x2: function (get) {
  12. return get('x') * 2;
  13. }
  14. }
  15. });

公式与显式绑定

在上面的例子中,公式的相关性被发现通过检查函数,然而,这并不总是最好的解决方案。可以使用一个显式绑定声明,这将返回一个简单的对象当所有的值绑定的。

  1. Ext.define('TestViewModel2', {
  2. extend: 'Ext.app.ViewModel',
  3.  
  4. alias: 'viewmodel.test2',
  5.  
  6. formulas: {
  7. something: {
  8. bind: {
  9. x: '{foo.bar.x}',
  10. y: '{bar.foo.thing.zip.y}'
  11. },
  12.  
  13. get: function (data) {
  14. return data.x + data.y;
  15. }
  16. }
  17. }
  18. });

viewmodel的更多相关文章

  1. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

  2. MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信

    MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...

  3. 页面与ViewModel(下)

    在上一篇博客中,笔者分享了一些从页面整体的角度对页面与ViewModel的思考.在本文中笔者希望从相对细节的角度分享一些对页面与ViewModel的思考. 比如,当我们在更新View Model中的绑 ...

  4. 页面与ViewModel(上)

    在UWP淘宝与旺信中,笔者主要负责页面与控件的制作,这些工作看似简单,但要想做的全面细致仍然需要深入的思考.本文想分享一些在UWP旺信的制作过程中,笔者在UI页面与控件制作上体会到的一些心得.可能笔者 ...

  5. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(三):两个Viewmodel搞定增删改查

    前言:之前博主分享过knockoutJS和BootstrapTable的一些基础用法,都是写基础应用,根本谈不上封装,仅仅是避免了html控件的取值和赋值,远远没有将MVVM的精妙展现出来.最近项目打 ...

  6. 轻量级前端MVVM框架avalon - ViewModel

    废话说了大几篇,我们开始来点干货了~ ViewModel的内部机制 在MVVM中,数据是核心.而jQuery则以DOM为核心. 而DOM只是HTML在JS的世界的抽象,是一个很易变的东西.因此如果业务 ...

  7. MVC5 DBContext.Database.SqlQuery获取对象集合到ViewModel集合中(可以利用这个方法给作为前台视图页cshtml页面的@model 源)

    首先我们已经有了一个Model类: using System;using System.Data.Entity;using System.ComponentModel.DataAnnotations; ...

  8. MVVM中数据验证之 ViewModel vs. Model

                                                      MMVM模式示意图. View绑定到ViewModel,然后执行一些命令在向它请求一个动作.而反过来 ...

  9. WPF MVVM中在ViewModel中关闭或者打开Window

    这篇博客将介绍在MVVM模式ViewModel中关闭和打开View的方法. 1. ViewModel中关闭View public class MainViewModel { public Delega ...

  10. LINQ 联查多表数据并封装到ViewModel的实现

    LINQ 联查多表数据并封装到ViewModel的实现 public List<MyTask> GetPagedTaskList(int pageIndex, int pageSize, ...

随机推荐

  1. 高清SDI编码器|上海视涛科技

    SDI编码器(E500)简介 SDI编码器(E500)是上海视涛科技出品的高性能SDI编码产品.该SDI编码器是上海视涛电子完全自主研发,并适用于各种SDI信号的编码采集及网络传输的专用硬件设备.可兼 ...

  2. Office 365 - SharePoint 2013 Online 之母版页和页面布局

    1.打开https://login.microsoftonline.com,登陆,点击SharePoint,如下图: 2.打开网站集,可以查看.添加.删除等管理操作: 3.打开一个站点,如下图: 4. ...

  3. Android表单UI及相应控件的事件处理

    一.Toast Toast是一种轻量级的提示工具,可显示一行文本对用户的操作进行提示响应 用法:Toast.makeText(context,text,time).show(); context:上下 ...

  4. 很好的UI动效设计参考

    toolBar下拉:

  5. Swift中的数组

    学习来自<极客学院:Swift中的字符串和集合> 工具:Xcode6.4 直接上基础的示例代码,多敲多体会就会有收获:百看不如一敲,一敲就会 import Foundation //数组: ...

  6. animation of android (2)

    android Interpolator 首先是android系统提供的变换方式: 这些方式将转载一篇文章: 转: http://www.cnblogs.com/mengdd/p/3346003.ht ...

  7. Linux之格式化与挂载

    格式化与挂载 一块硬盘要想被使用,要经过分区,格式化,挂载这三个步骤.前面我们讲过MBR分区和GPT分区. 下面我们就来讲一下如果格式化一个分区.其实很简单,一句话就能搞定了. 首先来查看一下sdb盘 ...

  8. internet connection sharing has been disabled by the network administrator

    Start > Run > gpedit.msc Locate; Computer Configuration/Administrative Templates/Network/Netwo ...

  9. tomcat 部署脚本

    将一下3个脚本放到一个目录里,做成一个 python 的包即可使用 脚本介绍 操作服务脚本 #!/usr/bin/env python # _*_coding:utf-8_*_ # Author: & ...

  10. ASP.NET中iframe框架点击左边页面链接,右边显示链接页面内容

    首先是主页面main.aspx <body style="background-color: #AFEEEE"> <form id="form1&quo ...