本文地址: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. angularjs 的ng-bind-html过滤了内容的style

    1.不使用ng-bind-html,使用trustAs() trustAsHtml(value) =   trustAs($sce.HTML, value) trustAsJs(value)  =   ...

  2. CRM 2013 系统设置新功能一:界面自动保存 及 SDK 中 Xrm.Page.data.entity.save

    CRM 2013 界面会自动保存了..在系统设置中默认“是”,如果不需要可以调整. CRM实体记录在新建时会有出现“保存”按钮,非新建状态下,没有“保存”按钮只有“新建”按钮,系统将会自动为你保存最后 ...

  3. 用doxygen+graphviz自动化生成代码文档(附详细教程)

    一.引子 用这两个工具可以自动的遍历代码,并且产生代码文档,我们先来看看效果,然后放出这两个工具的下载地址. 二.工具的下载地址 doxygen:http://www.stack.nl/~dimitr ...

  4. 系统自带的NSJSONSerialization解析json文件

    #import "ViewController.h" #import "Student.h" #import "GDataXMLNode.h" ...

  5. PL/SQL基础-异常处理

    --*********异常处理一.异常的类型 ORACLE异常分为两种类型:系统异常.自定义异常. 其中系统异常又分为:预定义异常和非预定义异常.1.预定义异常 ORACLE定义了他们的错误编号和异常 ...

  6. myeclipse10安装findbugs

    尝试过myeclipse10环境下,在线安装findbugs,插件包是能下载到指定目录下,可是由于版本问题,findbugs插件是不能使用的.所以才有了下面的离线安装 离线安装findbugs 操作系 ...

  7. vi, vim 基本使用(1)

    本文介绍了vi (vim)的基本使用方法,但对于普通用户来说基本上够了!vi 编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和 ...

  8. MFC Grid control 2.27

    原文链接地址:http://www.codeproject.com/Articles/8/MFC-Grid-control MFCGridCtrl是个强大的类,用于数据的表格显示. 1.类特征 Cel ...

  9. zookeeper 集群搭建

    windows 环境下单机搭建伪集群 zookeeper 版本3.4.8 1.创建各个目录server1.server2.server3 2.复制解压后的zookeeper3.4.8 到server1 ...

  10. python 小程序练习

    还有一些小bug 基本有 输入用户名密码 认证成功后显示欢迎信息 输出三次后锁定 # -*- coding:utf-8 -*- account_file=('C:\Users\guigu\Deskto ...