`
ruilin215
  • 浏览: 1104303 次
  • 性别: Icon_minigender_2
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

Qomolangma实现篇(九):Qomo中的模板系统

阅读更多

================================================================================
Qomolangma OpenProject v1.0


类别 :Rich Web Client
关键词 :JS OOP,JS Framwork, Rich Web Client,RIA,Web Component,
DOM,DTHML,CSS,JavaScript,JScript

项目发起:aimingoo (aim@263.net)
项目团队:..\..\Qomo_team.txt
有贡献者:JingYu(zjy@cnpack.org)
================================================================================

一、模板技术概要
~~~~~~~~~~~~~~~~~~
模板技术由来以久。在C++中的模板(Template)是编译时技术,而在.NET CLR中用于取代该技术的
范型(Generic)则是一种运行时技术。由于范型理论的出现,使范型编程成为一个新的语言课题。
在.NET CLR中,范型编程就是一种用模板来实现代码重用的高效技术(类范型和方法范型)。

然而,模板技术的使用也带来了很多的问题。例如:
- 模板系统的出现,是为了解决了类型问题呢,还是只是解决代码重用的问题?
- 通过模板来生成可运行代码框架,是否有利于节约代码呢?——而这种代码
的节约又增加了多少运行效率上的开销呢?
- 通过模板来生成框架之后,又是否可进行类型约束呢?类型约束的意义又何在呢?

相关的问题还非常的多。因此在Qomo的设计中,曾经一度为此而迷惑。但最终,我还是在Qomo的
内核一层加入了模板系统。


二、Qomo内核中的模板系统
~~~~~~~~~~~~~~~~~~
Qomo之所以要将Templet.js放入RTL,是希望在RTL一级支持一种全局性的模板语言,用于组织
框架中的重复性元素,包括脚本、样式和HTML等,甚至可以通过Templet来生成类。——如同
C++中的模板。

javascript的确不需要为了类型问题而实现一种模板或者范型系统,因此Qomo的模板与C++的模板并
不完全等义。这也是我使用Templet这个词,而不是Template的原因之一。这尽管是一个小小的差异,
但也希望引起你的注意。^.^

Templet支持一个用"%...%"格式描述的标签。如果写成"%%",则表明应该替换成单个的"%"。对于标
签中的被替换内容,Templet默认认为它来自于模板实例的Attribute。例如:
----------
function MyTemplet() {
_set('TempletContext', '<font color="red">%Info%</font>');

Attribute(this, 'Info', 'hello, world!');
}
TMyTemplet = Class(TTemplet, 'MyTemplet');

var ctx = new MyTemplet();
document.writeln(ctx);
----------

这段代码的运行结果,是向Document输入这样一段HTML:
----------
<font color="red">hello, world!</font>
----------

Templet的构造器还可以接受一个参数,它可以是从Qomo的Object继承下来的任意对象。这时,Templet
将使用该对象的,而不是模板实例的Attribute。例如与上面的例子等效的代码是:
----------
function MyObject() {
Attribute(this, 'Info', 'hello, world!');
}
TMyObject = Class(TObject, 'MyObject');

function MyTemplet() {
_set('TempletContext', '<font color="red">%Info%</font>');
}
TMyTemplet = Class(TTemplet, 'MyTemplet');

var ctx = new MyTemplet(new MyObject());
document.writeln(ctx);
----------

Qomo内核中的Templet,在默认设计上与HTML标签或者其它任何特定的内容都没有关系。因此你
可以用它来生成HTML的模板或者CSS的模板,甚至用它来生成javascript的模板并用eval()来执行。
——我想已经有人在开始假设这种技术能被应用到的环境了。哈哈。^.^

三、扩展Templet系统
~~~~~~~~~~~~~~~~~~
如果需要对构造器支持的这个参数的Attribute取值进行限制,例如屏蔽对一些特性(Attribute)的读取,那么
你也可以通过公布自己的IAttrProvider接口来达到目的。

例如:
----------
function MyTemplet() {
Attribute(this, 'Info', 'hello, world!');
Attribute(this, 'Info2', 'hello, world!');
_set('TempletContext', '<font color="red">%Info%, %Info2%</font>');

var cls = _cls();
var Intfs = Aggregate(cls.Create, IAttrProvider);
var intf = Intfs.GetInterface(IAttrProvider);
var has = intf.hasAttribute;
var hasOwn = intf.hasOwnAttribute;

intf.hasAttribute = function(n, t) {
return (n=='Info' ? false : has.apply(intf, arguments));
}
intf.hasOwnAttribute = function(n, t) {
return (n=='Info' ? false : hasOwn.apply(intf, arguments));
}
}
TMyTemplet = Class(TTemplet, 'MyTemplet');

var ctx = new MyTemplet();
document.writeln(ctx);
----------
在这个例子中,我们看到%Info%没有被替换,而%Info2%被替换了。这表明IAttrProvider接口被有
效的重写了。

四、Templet系统在Qomo组件框架中的使用
~~~~~~~~~~~~~~~~~~
在Qomo的组件框架中,模板系统是一个很关键的核心系统。简单的说,Qomo希望通过模板系统
来简化HTML代码的生成。同时模板系统也用于描述某个组件在DOM结构上的基本需求。

为此,Qomo在/Components/Controls/HtmlTemplet.js中实现了一套基础的HTML模板。此外,还
使用重写对象构造器的技术,来实现了Qomo组件与HTML中具体的Element的绑定。这里涉及到非
常多的技术组件,但主要包括在:
- /Components/Controls/HtmlTemplet.js
- /Components/Controls/HtmlController.js
这两个单元的实现中。——事实上,这两个单元是交叉作用的。

首先,在HtmlController.js中,我们使用AOP的技术,拦截了THtmlController的构造过程,并重写
了IAttrProvider接口。这样做的目的,是为了实现对THtmlController及其所有的子类进行影响,使
得他们的实例可以从Qomo对象的属性(property)与特性(attribute)中来取得值,可以从这个Qomo对
象所关联到的HTML Element的性质(HTML Attribute)中得到值。当然,为了完整地实现这个过程,
HtmlController.js中还重写了this.get()和this.set()方法。

现在,我们在Qomo中就可以这样写一段代码:
----------
<div id='elem' class="myClass">hello, world!</div>

<script>
var ctrl = new HtmlController();
ctrl.assign(document.getElementById('elem'));

document.writeln(ctrl.get('className'));
</script>
----------
这样,我们看到输出字符串“myClass”,但是,我们并没有为THtmlController这个类声明
“className”这样一个特性(attribute),ctrl.get()事实上是从elem这个元素中取得了值。

由于THtmlController类具有这样的功能,因此当一个关联了HTML Element的THtmlController
被作为一个TTemplet对象的输入之后,就可以顺理成章地将HTML Element的attributes用于
模板系统中了。

然而,这样仍然只是单向的功能。——也就是说,我们是为TTemplet提供了替换标签时所用的
对象。这并不表现我们已经构造了“Qomo的组件框架的模板库”。

这后面这个重任就是由HtmlTemplet.js来完成的了。在这个单元里,我们实现了:
- THtmlTemplet
- TInlineTemplet
- TBlockTemplet
- TTagTemplet
- TComponentTemplet

由于RTL已经内置了模板系统,因此事实上上面这些类的实现都非常简单。例如:
----------
function TagTemplet() {
_set('TempletContext', '<%tagName% id="%id%" class="%className%"%Attributes% />');
}
TTagTemplet = Class(THtmlTemplet, 'TagTemplet');
----------

最后,在TComponentTemplet中,我们将组件跟样式(CSS)关联了起来。这样一来,我们就
构成了整个Qomo的组件系统的基础逻辑:
- HTML Element与一个THTMLController组件关联,这是表达在浏览器中的实际对象;
- 每一个Qomo的组件可以有一个TComponentTemplet来描述该组件使用的DOM结构;
- 由于Qomo中,通过.js的代码来操作的具体对象,是一个由TComponentTemplet约束过的
DOM Element,所以只要其结构不变,则样式、效果的变化将不会影响到实现组件的.js代码。
- 通过TComponentTemplet模板,我们将CSS、HTML DOM和Qomo组件关联起来,但这种
关联非常松散,能轻易地表达“界面与逻辑分离”的UI设计思想。

这种结构,我们可以用下面的代码表现出来(这段代码在Qomo中是可以运行的):
----------
<div id='elem' class="myClass">hello, world!</div>

<script>
var ctrl = new HtmlController('elem');
var temp = new ComponentTemplet(ctrl);
alert(t);
</script>
----------
这段代码最终将显示“elem”对象作为一个Qomo组件的基本结构。

五、其它
~~~~~~~~~~~~~~~~~~
本节的内容,主要讲述模板系统,但也讲述了它对于Qomo的组件系统的价值。由于Qomo的组
件框架基于“界面与逻辑”分离的理论来进行实践,因此我们后续的文章中,将会用更多的时间
来讲述相关的知识,以及Qomo的实现方法。

Qomo的最新内核代码和组件库的基础代码,近期将在开发组内发布。

本文中没有讲述HtmlController()对象如何改变对象构造过程,也没有在代码一层,来讲述它如
何与Templet、CSS系统关联。这些是在今后的内容中讨论的。

分享到:
评论

相关推荐

    英语人教八年级下册UnitaQomolangmaPPT课件.pptx

    英语人教八年级下册UnitaQomolangmaPPT课件.pptx

    集团企业数字孪生平台信息化蓝图(应用系统架构、数据架构、IT基础设施与信息安全架构、信息化组织与管控.pptx

    集团企业数字孪生平台信息化蓝图(应用系统架构、数据架构、IT基础设施与信息安全架构、信息化组织与管控.pptx

    基于微信小程序的助农扶贫小程序

    大学生毕业设计、大学生课程设计作业

    node-v6.9.1.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于matlab开发的多元散射校正和变量标准化Matlab处理程序,可以对建模前的原始数据进行校正、处理.rar

    基于matlab开发的多元散射校正和变量标准化Matlab处理程序,可以对建模前的原始数据进行校正、处理.rar

    吉林大学离散数学2笔记 自用.pdf

    吉林大学离散数学2笔记 自用

    MyBatis使用动态SQL的if标签

    mybatis动态sql

    信息办公淘客在线客服管理系统TaokeOCS v3.2 站点版-root.rar

    TaokeOCS v3.2 站点版_root.rar是一个专为淘客设计的在线客服管理系统的JSP源码资料包。这个系统是针对淘宝客服务的一个全面解决方案,它提供了一种高效、便捷的在线客服管理方式。该系统采用JSP技术构建,具有高度的可扩展性和稳定性。通过这个系统,淘客可以方便地管理和跟踪他们的客户,提供实时的在线客服支持。系统的主要功能包括客户信息管理、在线聊天、问题反馈处理、订单管理等。此外,TaokeOCS v3.2 站点版还具有强大的数据分析功能,可以帮助淘客分析客户行为,优化销售策略。系统还提供了丰富的报表和统计图表,让淘客可以直观地了解业务运行情况。总的来说,TaokeOCS v3.2 站点版是一款功能强大、操作简便的在线客服管理系统,是淘客提升服务质量,提高销售效率的得力工具。无论是对于新手还是有经验的淘客,都可以通过这个系统轻松地进行在线客服管理,提高工作效率,增强客户满意度。重新回答||

    hushubo.zip

    hushubo.zip

    node-v12.8.1-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v9.6.1-x64.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    matlab实现遗传算法matlab源码.zip

    优秀源码设计,详情请查看资源内容

    3D模型004,可用于建模、GIS、BIM、CIM学习

    3D模型004,可用于建模、GIS、BIM、CIM学习

    毕业设计:基于SSM的mysql-口腔护理网站(源码 + 数据库 + 说明文档)

    毕业设计:基于SSM的mysql_口腔护理网站(源码 + 数据库 + 说明文档) 第二章 可行性分析 5 1. 业务流程描述 5 2. 经济可行性 5 3. 技术可行性 6 4. 运行可行性 6 第三章 需求分析 6 1. 健康管理系统的发展历史与现状 6 2. 健康管理系统的需求分析 7 3. 数据字典 7 第四章 总体设计 8 1.系统模块总体设计 8 2.数据库总体设计 9 3.数据库详细设计 9 第五章 详细设计与实现 11 1.运行环境 11 2.开发工具及技术介绍 11 3.系统界面设计 12 第六章 系统测试与性能分析 13 1.软件测试的概念 13 2.本系统的软件测试 13 3.本系统测试的总结 14

    基于matlab开发的单值分类,包括很多的工具函数,使用时直接调用就可,用起来相当方便的,欢迎大家下载.rar

    基于matlab开发的单值分类,包括很多的工具函数,使用时直接调用就可,用起来相当方便的,欢迎大家下载.rar

    毕业设计:基于SSM的mysql-在线考试系统(源码 + 数据库 + 说明文档)

    毕业设计:基于SSM的mysql_在线考试系统(源码 + 数据库 + 说明文档) 第2章 主要技术和工具介绍 1 2.1 SSM 框架 1 2.1.1. Spring 框架 1 2.1.2 SpringMVC 2 2.1.3. MyBatis 的选用 2 2.2 mysql数据库 2 2.3 eclipse与Tomcat简介 2 第3章 系统分析 1 3.1可行性分析 1 3.1.1经济可行性 1 3.1.2技术可行性 1 3.1.3操作可行性 1 3.2需求分析 1 3.3业务流程分析 2 3.4数据流程分析 3 第4章 系统设计 6 4.1系统结构设计 6 4.2功能模块设计 6 4.3数据库设计 7 4.3.1数据库设计概述 7 4.3.1概念设计 7 4.3.2表设计 8 第5章 系统实现 13 5.1基本任务 13 5.2登录模块的实现 14 5.2.1首页实现 14 5.2.2管理员后台登录 14 5.3教师用户模块的实现 17 5.3.1试题信息管理模块的实现 17 5.3.2试卷生成管理模块的实现 18 5.4管理员模块的实现 20 5.4.1系统用户管理模块的实现

    毕业设计:基于SSM的mysql-在线读书与分享论坛(源码 + 数据库 + 说明文档)

    毕业设计:基于SSM的mysql_在线读书与分享论坛(源码 + 数据库 + 说明文档) 2 系统需求设计 5 2.1 系统需求 5 2.2可行性分析 6 2.2.1技术的可行性 6 2.2.2经济的可行性 6 2.2.3操作可行性 7 2.2.4法律的可行性 7 2.4功能模块需求分析 7 3 系统设计 9 3.1系统结构设计 9 3.2 数据库设计 9 3.2.1 数据库实体 10 3.1.2 数据库表设计 12 4 系统的实现 13 4.1 主页的实现 13 4.2 章节信息界面 13 4.3 书籍信息界面 14 4.4 后台管理界面 15 4.6书籍添加管理界面实现 16 4.6书籍类别管理实现 17 5 系统测试 18 5.1 测试的目的及方法 18 5.2功能测试 18 5.3测试用例 19 5.4测试结果 20

    毕业设计:基于SSM的mysql-校园外卖管理系统(源码 + 数据库 + 说明文档)

    毕业设计:基于SSM的mysql_校园外卖管理系统(源码 + 数据库 + 说明文档) 二 关键技术介绍 3 2.1文件的上传和下载 3 2.2 echarts数据展示 3 2.3 MySQL数据库 4 2.4 java语言 5 2.5 MVC框架介绍 5 2.6 B/S结构 5 2.7小结 6 三 需求分析 7 3.1业务背景及需求分析 7 3.2业务建模 7 3.3系统角色分析 7 3.4系统用例分析 8 1、消费者用例图 8 2、 商户用例图 8 3、 管理员用例图 8 3.5非功能性需求 9 3.6小结 9 四 系统分析与设计 10 4.1系统架构 10 4.2系统功能设计 10 4.3数据库设计 12 4.3.1概念结构设计 12 4.3.2逻辑模型设计 13 4.3.3数据库物理模型设计 14 4.4系统界面设计 14 4.5小结 14 五 系统实现 15 5.1系统实现概述 15 5.1.1系统实现描述 15 5.1.2系统开发工具、语言、编码规范 15 5.2功能模块实现 15 5.2.1校园外卖订餐管理系统首页 15 5.2.2消费者会员登录的实现 15 5.2

    TypeScript-2.3.1.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Python和Flask实现的基于体检数据的城市公共健康可视分析系统源码+使用说明.zip

    优秀源码设计,详情请查看资源内容

Global site tag (gtag.js) - Google Analytics