关于Breeze.js+Angular.js+KendoUI+BootStrap+TypeScript+EF4.5的使用心得记录之一

第一章:数据交互

提醒:博客开篇之作。望指导。不喜随便喷。

什么也不说,先上图。

就kendoui官网有详细的API说明,不做过多累赘,以下图中用到的控件为例:

一.DropDownList,Grid

页面简洁得体,是我个人比较偏爱的。主要来讲讲DropDownList和GridOnLineEdit结合Angular和BreezeJs的应用。

1.Breeze.js

?功能:负责处理前端和后端程序的通讯。

用法:到官网下载Breeze包。在页面引入上图中JS。

添加Breeze.WebApi2.dll引用。 在后端控制器添加BreezeController特性。

[BreezeController(MaxAnyAllExpressionDepth = 2)]
    public class AppointmentsController : BaseController
    {
        readonly EFContextProvider<AppointmentContext> _contextProvider = new EFContextProvider<AppointmentContext>();
        readonly EFContextProvider<LookupContext> _lookupContextProvider = new EFContextProvider<LookupContext>();
        readonly EFContextProvider<SetupScreeningSiteContext> _siteContextProvider = new EFContextProvider<SetupScreeningSiteContext>();
        readonly EFContextProvider<LookupScreeningParameterContext> _screenCentreContextProvider = new EFContextProvider<LookupScreeningParameterContext>();
        TransactionSettings transactionSettings = null;

        /// <summary>
        /// Gets the context provider.
        /// </summary>
        /// <value>
        /// The context provider.
        /// </value>
        public EFContextProvider<AppointmentContext> ContextProvider
        {
            get { return _contextProvider; }
        }

        /// <summary>
        /// Gets or sets the transaction settings.
        /// </summary>
        /// <value>
        /// The transaction settings.
        /// </value>
        public TransactionSettings TransactionSettings
        {
            get { return transactionSettings; }
            set { transactionSettings = value; }
        }

        /// <summary>
        /// Returns metadata string serialized from data context.
        /// </summary>
        /// <returns>string</returns>
        [AccessRightAuthorize(AccessRight.DEFAULT_SITE)]
        //[AccessRightAuthorize(AccessRight.APPOINT_READ)]
        [HttpGet]
        public string Metadata()
        {
            string metadata = string.Empty;
            try
            {
                metadata = _contextProvider.Metadata();
                return ControllerHelper.attachDisplayNameToMetadata(metadata);
            }
            catch (Exception ex)
            {
                if (this.HandleException(ex))
                {
                    throw ex;
                }
            }
            return metadata;
        }

breeze 后台代码示例

   public getScreeningCentreById(centreId: number, forceRemote: boolean): breeze.promises.IPromise<App.DataAccess.Setups.ScreeningParameterModel.IEntityCentre> {
            var query = this.entityQuery
                .from("GetScreeningCentreParametersById")
                .withParameters({ centreId: centreId });

            return this.manager.executeQuery(query)
                .then((data) => {
                return data.results[0];
            });
        }

JS 数据查询

breaze.js的语法类似LINQ。

列举简单例子:

this.entityQuery.from("数据集合/后台方法名").withParameters("参数1,参数2,······").

where("查询条件").orderByDesc("排序属性").inlineCount();

this.manager.executeQueryLocally(query)

this.manager.executeQuery(query)

是不是非常眼熟。当执行这段代码的时候。才会去数据拿数据。manager是breeze在JS中定义的Entity。类似EF的概念。

executeQueryLocally是查询在缓存中的数据。默认只要查过的数据都会存在manager缓存中。executeQuery不会取缓

存数据。每次都会去执行后台代码,从数据库拿。

工作原理:

  当用户发起数据请求,系统会自动去找到改页面对应的控制器。通过Metadata()方法,拿到所需要的所有数据结构并且

返回给前端。

(注意:如果第一次是更新操作,没有拿数据结构,则必须先执行查询操作,否则会报错。)

页面所有操作的数据会缓存浏览器然后通过SaveChanges方法更新到数据库。参数"JObject saveBundle” 是JSON对象

。之前通过Metadata()拿到的所有结构和数据都会在里面。(优点:减少代码量,缺点:性能是个question.),当然,你也

可以选择存储过程。至于Breeze.WebApi2.dll 的内部实现,这节我们后面的章节会详细说明。

通过这一系列的准备工作。就可以进行数据交互了。

2.数据展示。Grid

拿到数据之后绑定到Kendo Ui就是几个参数配置的事情。但是,由于使用了Breeze,拿到的数据时beeze Entity的数据结构

形式的JSON,不被KendoUI Grid的schema所认识,我得和你搞好关系,你才能帮我办事。怎么办,重写Schema,先变成

你认识的样子再说。于是就有了下面这段:

 //#region Breeze kendo grid extention Methods
        public createSchema = (resourceName: string): any => {
            var schema: App.Shared.IBreezeKendoGridSchema = {
                total: function (data) {
                    return data.total;
                },
                model: {}
            };
            try {
                var typeObj = this.service.domainManager.getTypeByResourceName(resourceName);
            } catch (ex) {
                return schema;
            }
            var model: App.Shared.IBreezeKendoGridModel = {
                fields: {},
                id: {}
            };
            if (typeObj.keyProperties) {
                if (typeObj.keyProperties.length == 1) {
                    model.id = typeObj.keyProperties[0].name;
                } else if (typeObj.keyProperties.length > 1) {
                    var msg = "Multiple-key ID not supported";
                    this.logError(msg, "createSchema");
                    //typeObj.keyProperties.forEach(function (keyProp) {
                    //    model.id[keyProp.name] = keyProp.name;
                    //});
                }
            }
            typeObj.dataProperties.forEach(function (prop) {
                var type = "string";
                if (prop.dataType.isNumeric) {
                    type = "number";
                }
                else if (prop.dataType.isDate) {
                    type = "date";
                }
                else if (prop.dataType.getName() == "Boolean") {
                    type = "boolean";
                }
                model.fields[prop.name] = {
                    type: type,
                    defaultValue: prop.defaultValue,
                    nullable: prop.isNullable
                };
            });
            schema.model = model;
            return schema;
        }
//#endregion

createSchema

做完整容之后,按照Kendo UI官网配置来,就有了下面的图片。

备注:个人认为这套架构最大的优点就是无需业务层的任何数据操作代码。大大的减少代码量。提高了开发效率。与此同时,由于

数据操作代码和展示层都是TypeScript实现。几乎全站所有的代码,可以轻而易举的Copy。辛辛苦苦多少个日夜,一建

Copy全带走。

时间: 2024-08-06 14:06:21

关于Breeze.js+Angular.js+KendoUI+BootStrap+TypeScript+EF4.5的使用心得记录之一的相关文章

Require.js、Angular.js整合

Require.js 详见: 初识Require.js 解密Require.js Angular.js 详见: 初识Angular.js之爱恨情仇 整合Require.js.Angular.js 配置 在Requirejs中配置angular.js. require-main.js // 配置 requirejs.config({ ... paths: { 'jquery': 'libs/jquery-2.1.3/jquery.min', 'angular': 'libs/angular-1.3

MVC、MVP、MVVM、Angular.js、Knockout.js、Backbone.js、React.js、Ember.js、Avalon.js 概念摘录

转自:http://www.cnblogs.com/xishuai/p/mvc-mvp-mvvm-angularjs-knockoutjs-backbonejs-reactjs-emberjs-avalonjs.html MVC MVC(Model-View-Controller),M 是指业务模型,V 是指用户界面,C 则是控制器,使用 MVC 的目的是将 M 和 V 的实现代码分离,从而使同一个程序可以使用不同的表现形式. 交互方式(所有通信都是单向的): View 传送指令到 Contro

Angular.js入门(1)

1.Angular优点     1. 模板功能强大丰富,并且是声明式的,自带了丰富的Angular指令:    2. 是一个比较完善的前端MVC框架,包含模板,数据双向绑定,路由,模块化,服务,过滤器,依赖注入等所有功能:    3. 自定义Directive,比jQuery插件还灵活,但是需要深入了解Directive的一些特性.    4. ng模块化比较大胆的引入了Java的一些东西(依赖注入),能够很容易的写出可复用的代码,对于敏捷开发的团队来说非常有帮助,我们的项目从上线到目前,UI变

js框架——angular.js(5)

1. 3种过滤方式 1 <html> 2 <head> 3 <meta charset='utf-8'> 4 <script src="js/angular.js"></script> 5 <script src="js/app.js"></script> 6 <link rel="stylesheet" href="css/bootstrap.c

初识angular.js之爱恨情仇

angular.js Angular.JS 是一组用来开发Web页面的框架.模板以及数据绑定和丰富UI组件.它支持整个开发进程,提供web应用的架构,无需进行手工DOM操作. AngularJS很小,只有60K,兼容主流浏览器,与 jQuery 配合良好. 简单概括:MV*模型的js框架 angular.js之爱恨情仇 爱恋之际 MV*模式 职责清晰.层次分明,例如页面样式变化仅改变View代码,其它层次结构代码无需改动. 数据绑定 数据视图绑定(单.双向数据绑定),无需反锁的改变DOM的值或修

Angular.js 的初步认识

MVC模式 模型(model)-视图(view)-控制器(controller) Angular.js采用了MVC设计模式的开源js框架 1.如何在angular.js建立自己的模块(model),控制器(controller),操作模型数据. <head lang="en"> <meta charset="UTF-8"> <title></title> <script src="js/angular.

关于 angular js 的坑

angular js 很好很强大,但是注意,angular js并不适合操作DOM,虽然在某个版本更新过之后,angular 内部自建了 jqLite 来方便操作DOM,意图取代jquery的位置,真是居心叵测. 其实 angular 最好的地方还是给我们提供了一个新的思维方式,如果你是个新手,想看看传说中的 MVC 是个啥,在 ember, backbong, angular...等等众多框架中犹豫不决,那么推荐先看看angular 当然坑是很多,由于马上 2.* 的版本要出现,所以自然 1.

Angular JS 基础应用--第一篇

  前  言          Android应用开发中,有一些功能虽然能够使用原生JS来实现,但是会比较的复杂,因此一些相应的框架应运而生了.框架相对于原生JS而言,从主观上来说,最大的改变就是代码大幅度的减少了.在使用上,也比较方便易懂.因此,框架一经诞生就广受欢迎. 在本章,就将详细介绍其中一种框架的使用----Angular JS. AngularJS 通过 指令 扩展了 HTML,且通过 表达式 绑定数据到 HTML. angularJS表达式   1.angularJS使用双大括号{

angular js中的directive

angular js中的自定义指令 自定义指令return如下指令定义对象: restrict:restrict约束自定义指令的使用形式,取值有A(属性),E(元素),C(类),M(注释) template:该属性指定angular js指令被替换为html模板 scope:scope:true 表示创建一个作用域,该作用域继承于父作用域(即ng-controller控制的作用域), scope:{} 创建一个完全孤立的作用域,不会继承父作用域的任何数据 scope:{"@"} 创建一