本文地址: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方法。

Ext.create('Ext.panel.Panel', {
title: 'Simple Form', viewModel: {
type: 'test' // 稍后定义test这个ViewModel
}, bind: {
html: '<p>Hello {name}</p>',
width: '{someWidth}'
}
});

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

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

绑定布尔数据配置

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

Ext.create('Ext.panel.Panel', {
title: 'Simple Form', viewModel: {
type: 'test'
}, items: [{
xtype: 'button',
bind: {
hidden: '{!name}' // negated
}
}]
});

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

绑定和优先级

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

Ext.create('Ext.panel.Panel', {
title: 'Simple Form', viewModel: {
type: 'test'
}, bind: {
title: 'Hello {name}'
}
});

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

绑定和子控件

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

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}'
}]
});

绑定的两种方式

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

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

Ext.define('TestViewModel', {
extend: 'Ext.app.ViewModel', alias: 'viewmodel.test', // connects to viewModel/type below data: {
firstName: 'John',
lastName: 'Doe'
}, formulas: {
// We'll explain formulas in more detail soon.
name: function (get) {
var fn = get('firstName'), ln = get('lastName');
return (fn && ln) ? (fn + ' ' + ln) : (fn || ln || '');
}
}
}); Ext.define('TestView', {
extend: 'Ext.panel.Panel',
layout: 'form', // Always use this form when defining a view class. This
// allows the creator of the component to pass data without
// erasing the ViewModel type that we want.
viewModel: {
type: 'test' // references alias "viewmodel.test"
}, bind: {
title: 'Hello {name}'
}, defaultType: 'textfield',
items: [{
fieldLabel: 'First Name',
bind: '{firstName}'
},{
fieldLabel: 'Last Name',
bind: '{lastName}'
},{
xtype: 'button',
text: 'Submit',
bind: {
hidden: '{!name}'
}
}]
}); Ext.onReady(function () {
Ext.create('TestView', {
renderTo: Ext.getBody(),
width: 400
});
});

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

绑定组件状态

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

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

Ext.create('Ext.panel.Panel', {
title: 'Sign Up Form', viewModel: {
type: 'test'
}, items: [{
xtype: 'checkbox',
boxLabel: 'Is Admin',
reference: 'isAdmin'
},{
xtype: 'textfield',
fieldLabel: 'Admin Key',
bind: {
disabled: '{!isAdmin.checked}'
}
}]
});

绑定描述

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

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

Hello{name}:可以插入字符

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

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

多绑定

Ext.create('Ext.Component', {
bind: {
data: {
fname: '{firstName}',
lname: '{lastName}'
}
}
});

绑定了firstname和lastname

绑定记录

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

Ext.create('Ext.Component', {
bind: {
data: {
reference: 'User',
id: 42
}
}
});

这需要用到Ext.data.Session

关联绑定

看user的adress属性

Ext.create('Ext.Component', {
bind: {
data: {
reference: 'User',
id: 42,
association: 'address'
}
}
});

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

绑定操作

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

Ext.create('Ext.Component', {
bind: {
data: {
bindTo: '{name}',
single: true
}
}
});

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

Ext.create('Ext.Component', {
bind: {
data: {
bindTo: '{someObject}',
deep: true
}
}
});

创建 视图模型ViewModels

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

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

规则 Formulas

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

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

Ext.define('TestViewModel2', {
extend: 'Ext.app.ViewModel', alias: 'viewmodel.test2', formulas: {
x2y: function (get) {
return get('x2') * get('y');
}, x2: function (get) {
return get('x') * 2;
}
}
});

公式与显式绑定

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

Ext.define('TestViewModel2', {
extend: 'Ext.app.ViewModel', alias: 'viewmodel.test2', formulas: {
something: {
bind: {
x: '{foo.bar.x}',
y: '{bar.foo.thing.zip.y}'
}, get: function (data) {
return data.x + data.y;
}
}
}
});

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. C语言异常与断言接口与实现

    程序中通常会出现三种错误:用户错误.运行期错误以及异常 欢迎关注我的个人博客:www.wuyudong.com, 更多精彩文章与您分享 标准库函数setjmp和longjmp 在C语言中,标准库函数s ...

  2. IOS 网络浅析-(八 NSURLSession简介)

    就在不长也不短的时间前,苹果正式命令咱们要向NSURLSession看,因此我们不得不认认真真的听从老大的教导,努力认知NSURLSession.其实呢,三方早已为我们解决了问题,但是呢,我们还是有必 ...

  3. IOS SDWebImage实现原理详解

    在之前我写过SDWebImage的使用方法,主要是用与获取网络图片,没有看过的朋友可以看看. 这篇文章将主要介绍SDWebImage的实现原理,主要针对于获取网络图片的原理,如果没有第三方我们该怎么去 ...

  4. [Weblogic]startWebLogic.cmd配置JAVA_OPTIONS无效的解决思路与方案

    事情背景: 由于某个项目原因,需要在2个域的startWebLogic.cmd文件加入如下设置 set JAVA_OPTIONS=%JAVA_OPTIONS% -javaagent:"pat ...

  5. Effective Java 50 Avoid strings where other types are more appropriate

    Principle Strings are poor substitutes for other value types. Such as int, float or BigInteger. Stri ...

  6. Sqlserver创建连接MySql的链接服务器

    第一步:在MySql服务器上安装与系统对应的 MySql-Connector-ODBC  官方下载地址 安装过程中可能会报 缺失 msvcr100.dll 的错误,这需要你根据系统到网上下载对应的这个 ...

  7. 【同步复制常见错误处理3】找不到存储的过程 sp_MSins_tablename

    环境在SQL2008 R2同步复制时出错 这个错误提示是由于在订阅端没有找到同步时调用的同步存储过程,MS错误说明: 当某个事务发布在 SQL SERVER自动同步设置选择订阅服务器插入. 更新和删除 ...

  8. C#XmlHelper操作Xml文档的帮助类

    using System.Xml; using System.Data; namespace DotNet.Utilities { /// <summary> /// Xml的操作公共类 ...

  9. Google Guava之--cache

    一.简介 Google Guava包含了Google的Java项目许多依赖的库,如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives support ...

  10. Windows x86/ x64 Ring3层注入Dll总结

    欢迎转载,转载请注明出处:http://www.cnblogs.com/uAreKongqi/p/6012353.html 0x00.前言 提到Dll的注入,立马能够想到的方法就有很多,比如利用远程线 ...