`
lwz7512
  • 浏览: 331695 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

openlaslzo开发之进阶篇-理解绑定

阅读更多

    RIA除了在界面效果吸引人外,功能是最主要的,让用户在互动操作中体验到简化的操作流程,丰富而强大的应用程序体验,这才是RIA的魅力。
    openlazlo的编程语言lzx就可以满足这种要求,而且开发人员无需编写过多的代码,就可以完成许多数据操作,这就是本节所介绍的,lzx中最有用的功能:绑定。

    openlaszlo的绑定功能分为:

  •  视图绑定
  •  数据绑定

    按绑定方式划分又分为:

  •    一次绑定
  •    始终绑定
  •    运行时绑定

    下面就介绍openlaszlo的绑定特性。

1. 视图绑定

   视图绑定是界面布局中比较常用的方法,一般情况下,所有的视图元素都可以用绝对位置来指定,但是这样有两个缺点,一个是修改布局中某一个视图的位置,就需要修改和它相邻的或者和它层叠的视图位置;另一个缺点是实现某个视图运动动画时,需要指定其相关视图的运动。
   这样的后果就是需要编写额外的代码来实现,增加了劳动量,也没有充分体现lzx语言的力量。我们本可以用更简单的方式做。下面看几个小例子:

 1.1 简单绑定实例

<!------------------------------------------>
<!--bindingview_1.lzx-->
<!------------------------------------------>
    <canvas title="视图绑定例子" width="800" height="600" debug="true">
       <view name="left" x="20" y="20" width="100" height="100" bgcolor="#FF0000"/>
       <view name="right" x="140" y="20" width="100" height="100" bgcolor="#00FF00"/>
       <view name="bindtoleft" x="$once{parent.left.x}"
             y="$once{parent.left.y+parent.left.height+20}"
             width="100" height="100" bgcolor="#0000FF"/>
    </canvas> 

访问地址:http://www.openria.cn/lps-3.0/my-apps/bindingview_1.lzx?lzt=html

  这个例子是lzx的简单布局实例,视图left和right都是绝对布局,而视图bindtoleft将自己的位置绑定到了

left,使用的语法是:
   x="$once{parent.left.x}"
   y="$once{parent.left.y+parent.left.height+20}"

   $表示绑定符,once表示一次绑定,如果始终绑定就不用写once了。大括弧{}加里面内容构成一个表达式用来表示当前视图的属性由表达式决定。
   将这两句话翻译过来就是说,bindtoleft的x值即水平位置就是left的水平位置;bindtoleft的y值即垂直位置就是left的垂直位置再加20个象素(往下移动20个象素)。

   这样看起来好像挺麻烦,但是如果你修改视图left的位置和大小时,就不用理会bindtoleft的位置和大小,而right看起来写的挺方便,但是缺需要跟着left改。尤其是应用程序中的视图很多时,这种绑定会很方便,尤其是关系紧密的视图。

  1.2 始终绑定实例

<!----------------------------------------->
<!--bindingview_2.lzx-->
<!----------------------------------------->
<canvas title="始终绑定例子" width="800" height="600" debug="true">
    <view name="left" x="20" y="20" width="100" height="100" bgcolor="#FF0000"/>  
    <view name="bindtoleft" x="$once{parent.left.x}"

y="$once{parent.left.y+parent.left.height+20}"
         width="100" height="100" bgcolor="#0000FF"/>
    <button name="runview" x="20" y="260" text="clickMe">
        <method event="onclick">
            parent.left.animate('x',200,500,false);       
        </method>   
    </button>    
</canvas>

访问地址:http://www.openria.cn/lps-3.0/my-apps/bindingview_2.lzx?lzt=html

点击一下按钮,会发现left(红色的矩形)移动了,但是如果想让蓝色的矩形(bindtoleft)也跟着动怎么办呢,很简单,把bindtoleft的x="$once{parent.left.x}"属性改为x="${parent.left.x}"就可以了,试试吧,

是不是很爽,都不用再编写额外的代码移动bindtoleft。除了能对x,y进行绑定,视图的其他属性,比如visible属性也可以进行绑定,这种绑定也经常用到。

 2. 数据绑定

   基于openlaszlo的应用程序和其他RIA技术如flex一样,是数据驱动的应用程序,也就是说界面的框架定下来后,它的具体内容是由数据来决定的,有多少数据就会生成多少视图。 这一过程的实现就是依靠“数据绑定”。依靠数据绑定,openlaszlo的应用程序将完全脱离传统web应用基于页面思想的编程方式,用动态语言来输出页面标签,实现动态视图。从而真正的实现MVC模式,让数据和视图彻底分开。

   数据绑定和视图绑定一样仍然分为两种情况,一次绑定和运行时绑定,这个“运行时绑定”也可以称为动态绑定。可以看作是多个一次绑定构成运行时绑定。下面看几个例子:

   2.1 始终绑定实例

<!------------------------------------->
<!--databinding_1.lzx-->
<!------------------------------------->
<canvas width="800" height="600" debug="true" fontsize="12">
    <dataset name="ds1">
      <root>
        <node name="第一条数据"/>
        <node name="第二条数据"/>
        <node name="第三条数据"/>
        <node name="第四条数据"/>
        <node name="第五条数据"/>
        <node name="第六条数据"/>
        <node name="第七条数据"/>
      </root> 
    </dataset>
    <list name="samplelist" x="10" y="10" width="100" height="100" datapath="ds1:/*">
        <textlistitem text="$path{'@name'}" datapath="*"/>   
    </list>
</canvas>

访问地址:http://www.openria.cn/lps-3.0/my-apps/databinding_1.lzx?lzt=html

   从这个例子可以看出,列表的内容完全由dataset的数据生成的,而且在编译的时候就已经数据和list组件绑定在一起了,即通过list的datapath="ds1:/*"来绑定到数据集ds1上。这样做比较死板,实际应用中很少这样做。

  2.2 运行时绑定(动态绑定)实例

<!------------------------------------->
<!--databinding_2.lzx-->
<!------------------------------------->
<canvas width="800" height="600" debug="true" fontsize="12">
    <dataset name="ds1">
      <root>
        <node name="第一条数据"/>
        <node name="第二条数据"/>
        <node name="第三条数据"/>
        <node name="第四条数据"/>
        <node name="第五条数据"/>
        <node name="第六条数据"/>
        <node name="第七条数据"/>
      </root> 
    </dataset>
    <dataset name="ds2">
      <root>
        <node name="firstItem"/>
        <node name="secondItem"/>
        <node name="thirdItem"/>
        <node name="fourthItem"/>
        <node name="fitthItem"/>
        <node name="sixthItem"/>
        <node name="seventhItem"/>
      </root> 
    </dataset>
    <method event="oninit">
        samplelist.datapath.setPointer(ds1.childNodes[0]);
    </method>
    <list name="samplelist" x="10" y="10" width="100" height="100" datapath="" dataoption="lazy">
        <textlistitem text="$path{'@name'}" datapath="*"/>   
    </list>
    <button name="getenglishlist" x="10" y="150" text="获取英文列表">
        <method event="onclick">
            parent.samplelist.datapath.setPointer(ds2.childNodes[0]);       
        </method>   
    </button>
    <button name="getchineselist" x="10" y="180" text="获取中文列表">
        <method event="onclick">
            parent.samplelist.datapath.setPointer(ds1.childNodes[0]);       
        </method>   
    </button>
</canvas>

    访问地址:http://www.openria.cn/lps-3.0/my-apps/databinding_2.lzx?lzt=html

    对比这个例子和前面那个例子,可以看出,list的datapath开始是为空的,而在程序init的时候,才给它绑定数据,点击按钮又改变的绑定数据源,这样就是运行时的数据绑定。
    在实际的应用开发过程中,很多情况需要运行时绑定,这样可以减少服务器的编译时间和减少文件尺寸,充分利用客户端的运算能力,可以在客户端有更直接快捷的数据更新,而无需刷新页面,改善用户体验。

    此外,通过对list对应的数据集的操作,如增、删、改,可以直接影响到list的视图表现。
    注意:本例使用dataoption="lazy"来实现list的性能优化,从而使视图更新时更快,更适合大数据量的展现。

  
   3. 与数据绑定相关的内容

   3.1 数据指针:datapointer
      
       数据指针和数据集几乎是形影不离,每申明一个远程的dataset,就应该申明一个对应的datapointer,让这个datapointer指向dataset。让datapointer来表明dataset的状态并执行对应视图的视图绑定。
     比如:
     <dataset name="remotedata" src="sampleAction.jsp" type="http" request="false"/>
     <datapointer name="remotedatapt" xpath="remotedata:/*">
         <method event="ondata">
            viewname.datapath.setPointer(this.p);
         <method/>
     <datapointer/>

   3.2 数据元素:LzDataElement

      dataset是继承自LzDataElement,有时需要在运行时用脚本来生成数据来给视图用,这时使用的对象就是LzDataElement,比如:
      var sampledata = new LzDataElement('root');
      sampledata.appendChild(new LzDataElement('node'));
      sampledata.appendChild(new LzDataElement('node'));

  这就生成了一个类似于dataset的数据集,即:
      <root>
         <node/>
         <node/>
      <root/>
  
   3.3 数据路径查询:datapath.xpathQuery()

      很多时候,要从视图中取得某个属性,然后进行判断或者操作,这时候需要用到这个功能,比如:

      var someattr = sampleview.datapath.xpathQuery('@value');
      这是查询视图sampleview的数据集中属性为value的值。
      具体内容见开发文档中xpath中的介绍。


结束语

   掌握了openlaszlo的视图和数据绑定,以及数据操作,就基本掌握了openlaslzo开发的精髓,关键的是要改变思想,要thinking in RIA,开发RIA是构建应用,而不是写页面,还是系列文章开篇所讲,openlaszlo的开发思想是:

      面向对象
      基于组件
      数据驱动

    有时感觉做openlaszlo开发就像是在做swing或者vb开发,只是没有多线程的烦恼,唯一不足的是没有所见即所得开发工具,要不会很爽,而ide4laszlo插件又不好用。

    下一篇将介绍开发自定义组件,openlaszlo开发之高级篇,敬请期待。  
    



分享到:
评论

相关推荐

    iOS开发进阶-完整版

    根据提供的信息,我们可以推断出这是一本关于iOS开发进阶的书籍,作者为唐巧。虽然提供的部分内容似乎并不是实际的章节内容,但从标题、描述和标签中,我们可以推测本书可能涵盖的一些关键知识点。 ### iOS开发进阶...

    iOS开发 - 第02篇 - UI进阶 - 03 - TableView Cell

    在`iOS开发 - 第02篇 - UI进阶 - 03 - TableView Cell`中,我们将深入探讨以下知识点: 1. **UITableViewCell**:作为UITableView的基本单元,UITableViewCell是显示数据的最小元素。每个cell通常包含一个或多个...

    C语言进阶源码---UDP传输系统

    **C语言进阶源码——UDP传输系统** 在IT领域,网络编程是不可或缺的一部分,而C语言因其高效、灵活的特点,常被用于底层系统开发,包括网络通信。本项目聚焦于C语言实现的UDP(User Datagram Protocol)传输系统,...

    K8s入门与进阶课件-下-20201126-Q.zip

    这个"K8s入门与进阶课件-下-20201126-Q.zip"压缩包文件包含了深入理解Kubernetes的基础知识和高级概念的课程资料。以下是基于该课程主题的一些关键知识点的详细介绍: 1. **Kubernetes基本架构**:K8s由控制平面...

    网康进阶之ICG教程大全.zip

    【网康进阶之ICG】-07-用户绑定(三层).pdf 【网康进阶之ICG】-07-用户绑定(二层).pdf 【网康进阶之ICG】-07-用户黑名单.pdf 【网康进阶之ICG】-07-网关模式下网络地址转换. 【网康进阶之ICG】-07-网址白名单....

    HTML进阶附件-内容

    9. **框架与库的使用**:HTML进阶学习也包括如何集成和利用如Bootstrap、Vue.js、React等前端框架或库,它们提供了现成的UI组件和便捷的开发工具。 10. **响应式设计**:随着移动设备的普及,HTML页面需要适应不同...

    STM32 进阶课程-TCP.pdf

    基于提供的文件信息,关于STM...理解这些知识点对于开发高性能的网络应用和系统至关重要,尤其是在资源受限的嵌入式设备上实现TCP/IP通信。在实际应用中,这些知识点将帮助开发者设计出稳定且高效的网络通信解决方案。

    J2EE快速进阶培训-bmp.ppt

    J2EE快速进阶培训旨在帮助开发者快速掌握J2EE的核心概念和技术,提升在企业级Web应用开发中的技能。 **核心知识点** 1. **Servlet与JSP** - Servlet是Java编写的小型服务器端程序,负责处理HTTP请求,生成动态...

    J2EE快速进阶培训-(PPT)

    这个快速进阶培训课程旨在帮助开发者深入理解和熟练掌握J2EE的核心概念和技术,提升在企业开发中的技能。 **ejb.ppt - 企业JavaBean(EJB)** 企业JavaBean(Enterprise JavaBeans)是J2EE的重要组成部分,主要...

    WPF-进阶视频教程(共113集)-013绑定到对象集合.mp4

    WPF-进阶视频教程(共113集)-013绑定到对象集合.mp4

    WPF-进阶视频教程(共113集)-016绑定到LINQ表达式.mp4

    WPF-进阶视频教程(共113集)-016绑定到LINQ表达式.mp4

    Creoe二次开发3—进阶篇.rar

    总的来说,“Creoe二次开发3—进阶篇.rar”这个压缩包旨在帮助中级或高级开发者深入理解并熟练运用CREO的二次开发技术,提升其在实际工程中的应用能力。通过学习,开发者可以为企业带来更大的价值,推动设计创新和...

    WPF-进阶视频教程(共113集)-015绑定到ADO_NET对象.mp4

    WPF-进阶视频教程(共113集)-015绑定到ADO_NET对象.mp4

    flex企业应用开发笔记-数据绑定

    这篇笔记主要探讨的是如何在Flex中实现数据绑定,以及其在实际应用中的作用。 数据绑定是Flex框架的核心特性之一,它允许开发者将界面元素的属性(如文本框的文本内容)直接绑定到应用程序的数据源,当数据源发生...

    WCF学习进阶篇

    **WCF学习进阶篇** Windows Communication Foundation (WCF) 是微软.NET框架中的一种服务导向架构,用于构建可互操作的、安全的、可靠的服务。它整合了多种通信技术,如Web服务、消息队列、TCP/IP等,使得开发者...

    vue-基础-进阶-111

    Vue.js 是一款轻量级的前端JavaScript框架,以其易学易用、高性能和组件化的特点在Web开发领域受到广泛欢迎。"vue-基础-进阶-111"这个标题暗示我们将深入探讨Vue的基础概念以及一些进阶技巧。在这个主题中,我们将...

    vue学习(vue基础篇、vue进阶篇、Vue模块篇).rar

    本资源包含`vue基础篇`、`vue进阶篇`和`Vue模块篇`三个部分,旨在帮助开发者全面理解和掌握Vue.js。 在`vue基础篇`中,你将学习到Vue的基础概念和核心特性,包括: 1. **安装与设置**:如何通过CDN或npm引入Vue.js...

    藏经阁-Augular2+进阶开发实战-75.pdf

    在Angular2+进阶开发实战中,我们关注的是性能优化、工具与工程化以及常见问题的解决方案。在本文档中,我们将重点讨论性能优化,特别是针对运行时性能的提升。 性能优化是任何Web应用程序开发中的关键环节,对于...

    Android应用开发进阶(源码)

    在Android应用开发领域,进阶学习是提升技能的关键步骤。本资源主要涵盖了三个核心主题:自定义控件、第三方组件的使用与实现原理以及Android应用架构。这些知识点都是Android开发者必须掌握的重要技能。 首先,...

    ORA-01480STR 绑定值的结尾 Null字符缺失 的问题原因及解决办法

    首先,我们要理解“STR 绑定值的结尾 Null 字符缺失”错误的可能原因。常见的解释包括: 1. 数据中存在非法字符:如半个引号(')或其他非打印字符,导致解析异常。然而,根据描述,经过测试,排除了这种可能性。 ...

Global site tag (gtag.js) - Google Analytics