Language Preliminaries

出自OpenFace

跳转到: 导航, 搜索

Prev                                                                         Next

                               第二章  语言初步

                               第一部分  概况



  LZX是一种面向对象,以tag为基础的语言,通过使用XML和Javascript语法来创建RIA(Rich Internet Application)应用的表现层界面。LZX编写的应用需要OpenLaszlo的编译器编译(基于OpenFace的LZX应用需要OpenFace的编译器编译)。LZX语言规范包括一套XML标签和一组JavaScipt API。


  LZX的语法和命名习惯等都设计得和其他语言差不多,所以对于有丰富的web开发人员来说,是很容易学习并将应用融合到他们计划的环境中。


  一个运行中的LZX应用产生一个被称为canvas的可视对象,这就是应用实际在屏幕上所占的区域。在canvas中,自动管理各个视图间的交互,这些视图产生逻辑上或者视觉上的嵌套,它们有很多能被控制的属性,包括大小、位置、背景颜色、透明度、是否能被拉伸等等。视图还能包含图片等资源。一个视图的属性能作用到另外的一些视图的属性上,并且视图的任何属性都能产生动画效果,也就是说属性的值可以随时间而变化。


  LZX的视图系统和其它许多的视图系统是类似的,但是和其它UI技术比较,它引入了数据绑定、属性约束和动画机制。


  LZX应用有代表性地包含了描述和程序这两种结构,而且这种语言顺从了很多CSS(Cascading Style Sheets)的命名习惯。从而使得LZX编写的应用显得简单,就像内嵌Javascript的DHTML应用那样。但是相对DHTML/JavaScript这些类型的应用来说LZX应用在概念上还是有一定区别,比如说前者是边解释边执行的,而LZX应用则相反,它需要先在服务器上编译,然后将编译后的字节码下载到目标解释引擎上运行。


  在OpenFace平台上,LZX Server将应用编译成能在OpenFace player上执行的二进制文件并形成player上的应用格式,但是LZX语言和player之间本身没有任何联系,也没有任何依赖关系。


  这样,尽管LZX应用中使用了JavaScript,但是被Server编译后Javascript的作用同传统web应用中Javascript被用来和浏览器交互或者改变HMTL页面的作用是有差别的。这种直接和浏览器交互或者改变HTML页面的动能在LZX应用中是不存在的。这使得LZX语言的设计尽管和传统的其它语言类似,但是它确实是新的一种语言。


  本章概括了LZX从传统语言中继承和创新的方面,但仅仅是概括性的,而不是详细的指南,在您读完后也许您能更好地判断是否需要学习这门语言。根据您的专业背景和经验,在您探索LZX之前也许你要先确定是否要学习一些XML或者面向对象编程方面的知识。另一方面,如果你发现这些很容易理解,你可以跳到其他合适的章节并且开始编写一些代码,这样的话建议您从基础指南开始。

目录

语法概述

  LZX中XML 标签被用来创建Javascript对象,同时LZX中的Javascript也被用来操纵被标签创建出来的对象。大多情况下通过标签能完成的工作使用Javascript也能完成,反之亦然。但是这不是说在任何地方使用它们都是相同的,在某些情况下使用一种方案可能比另外一种好很多。学习完基本的LZX语法后接着可以学习各种标签及API,完全掌握这门语言需要在开发中去理解程序中语法等方面一些细微的差别,然后学习在什么情况下什么时候去用它们。


  LZX 严格遵循XML和Javascript语法

  下面的部分列出了LZX两种语法的大纲,最后部分讨论了Javascript和XML如何在LZX中一起工作。

XML

  XML,可扩展的标记性语言,是W3C为结构化数据定义的标准。为了编写LZX应用出于两个原因您需要掌握XML的概念:1、LZX应用中的很多功能是直接使用一个XML标签定义的,并且LZX应用本身(LZX应用源代码)就是一个有效的XML文档,如果这个XML文档不是有效的就不会被LZX服务器编译。2、LZX应用只能操作XML中的数据。


  如果您已经理解XML中的标签及其属性,并且了解XML中根节点及其子节点之间的嵌套关系,那么您应该就可以开始学习LZX。要了解更多关于XML的信息及相关书籍等请访问W3C网站


  在XML和Javascript中一个差别是在XML中表示类型的使用小写字母比如("string","number"),而在Javascript中则变成大写的"String","Number"。在XML中使用<attribute name="foo" type="string"/>表示类型的名称,这是为了兼容XML的数据类型规范。

XML and HTML

  如果您对HTML比较有经验而不是XML,您会发现两者有很多类似之处。下面列举了XML和HTML不同的地方,适用于所有的XML。

  * 大小写敏感,b和B标签不同。(LZX中在text标签中使用b标签表示粗体,LZX中没有B标签)


  * 属性的值必须被双引号或者单引号引起来,比如<view width=100>在XML中是无效的,应该使用<view width="100">或者<view width='100'>


  * 空的元素标签必须关闭,
是有效的HTML写法,但是在XML中必须使用
</br>或者


JavaScript

  Javascript最早是Brendan Eich编写在Netscape2.0浏览器中一种语言。它一经推出就马上取得了成功并且在其它浏览器上得到了推广,为了保护它标准化的价值,ECMA(欧洲计算机制作协会,European Computer Manufacturer's Association)组织将这门语言编制成ECMAScript标准并且一直维护着这个标准的更新和升级。尽管Javascript是由该组织正式标准化,而且在不同的实现平台上有所差距(比如IE的Javascript和Netscape的Javascript),但是一般情况下说Javascript和ECMAScript是等价的。更准确的说,说“ECMAScript”更多是指纯粹的语言(语法)范畴,而说“JavaScript”则除此之外还包含了在不同的浏览器中提供的关联库(通常我们说客户端或者浏览器端的JavaScript),在本文档中我们说的Javascript采用大家通常所指的含义,不会特别强调概念上的区别,并且在后面的讨论中我们尽量让它在上下文语言中容易理解。文中所用的"script"是指使用Javascript编写的代码段。


  LZX 实现了ECMA-262 第三版的主要部分内容。

  为了能写出比较好的LZX代码,你必须理解Javascript中以下的内容:

  * 基本控制结构(for,while等等语句)

  * 对象模型

  * 松散数据类型

  * 作用域范围

  根据您的背景知识,您会觉得LZX中Javascript语法是熟悉还是陌生的,比如说,如果你对Java非常熟悉而不是Javascript,你只需要了解这两个语言之间的一些关键差距,特别是数据类型,对象模型和变量的作用域方面。


  和其它比如象Perl和Python之类的脚本语言一样,Javascript是一种弱类型语言,你无需定义其类型就声明一个变量,这样能快速地开发应用原形并且代码也容易阅读,但是这可能也会导致一些难以发现的数据类型错误。


  JavaScript也是一种面向对象编程的语言,但是没有像Java等那样严格,它没有包或者接口之类的,也没有真正的class,最后要注意的是在JavaScript中的全局和局部变量相对Java来说可能会产生让您惊讶的结果。


  反过来说,如果您是一名富有经验的Javascript应用人员,您也必须抛弃某些您从之前经验中的思维习惯,特别是一些比较常用的对象和函数之类(比如说您之前常用的浏览器端对象location在LZX中就不再存在)。此外LZX中相比纯粹的Javascript而言,它有完整的面向对象编程模型中需要的对象,确切地说就是LZX中有类和继承。


  如果您没有Java或者Javascript方面的经验,在继续深入LZX之前,您需要学习Javascript,比如到w3schools.com找一本指南学习。

点(.)语法

  LZX使用dot(点)语法引用对象和成员之间的关系,比如下面的语句

this.that

  在Javascript中,上面的"this"是一个对象,而"that"则是这个对象的一个属性,一个属性也可以是一个方法(函数)。考虑下面的LZX代码段。

考虑如下的lzx代码片段

 <view name="beatles"> 
   <view name="george"/> 
 </view>

  在上面的例子为了引用到"beatles"内部的view "george",可以使用beatles.george,这里"george"是"beatles"的一个子节点。

  在后面的介绍中,LZX提供多种方法来定义属性、方法、对象或者类,比如下面的代码中两种代码都达到了同一个效果(创建一个name为"myview"的view元素,并且设置它的背景颜色为红色)。


JavaScript:

myview = new LzView;
myview.setAttribute (bgcolor, red);

XML tag:

 <view name="myview" bgcolor="red"/>

  在上面两个例子中,myview的背景颜色在以后的代码中都可以通过myview.bgcolor方式来访问,这种圆点用法提供了对任何内部对象方便的引用,而不管是定义的一个标签还是Javascript的代码。

大小写敏感

  OpenFace中的LZX是大小写敏感的。所以编写代码时注意LZX中标签和Javascript代码中使用的拼写保持大小写一致。

LZX DTD和Schema

  一个XML schema定义了LZX中能使用哪些标签,这个schema被LZX编译器(前面提到的LZX服务器中包含)作为判断LZX应用格式是否正确的依据。比如说这个schema定义了在一个view标签中可以使用哪些属性,但是你的应用中却使用了一个没有在schema中定义的熟悉,那么编译时会报一个警告(tomcat的输出窗口)。

  LZX也允许您定义您自己的标签,用户定义的标签不会加入到schema中,尽管编译器通过内置的schema检查应用的有效性。但是用户自定义标签需要遵循一定的原则,详细请见class部分。

对象和属性

  LZX结合了标准的面向对象编程中封装、多态的概念,一般说,LZX应用中的一个标签就对应着以该标签名称相称的class的实例对象,比如view标签就对应一个LzView(class名)的对象。


  进一步说,LZX是一种控制叫视图的可视对象的以规则为基础的描述性语言,而这些规则就是表示如何来约束这些对象的属性值。


  接下来的部分总结了LZX中面向对象概念中关键点。

对象

  对象是一种包含名称和数据值的数据类型,根据上下文,对象中一个名称的数据可以被称为各种属性(property,attribute)。比如说一个view标签对象有几十个属性,比如高度、宽度、水平位置、垂直位置等等,当这个对象被创建时,这个属性一般都被赋值了,如果您没有指定一个值那么可能就被设置成一个缺省的值。

  在LZX中可以通过<class>标签创建一种新类型的对象,定义的每个新class都必须有一个name属性,并且有一个extends属性说明这个class继承自某个class,如果没有指定则缺省继承自view。基于这个新类创建的对象继承了所有父类的属性和方法,再加上在新类中定义属性和方法。比如下面一个简单的例子:


 <class name="myview" extends="view"/>

  这个例子定义了一个名叫myview的新类,它有view中所有的属性和方法(在这个例子中myview没有定义自己的属性和方法,因此使用它同使用view标签是一样的)。

属性

  在LZX中词“attribute”有两种细微差距的含义,一种是词法上的,一种是语义上的。XML中,从词法上说,"attribute"是一个在XML元素中定义的名称值对,比如:

<boss demeanor="friendly"/>

  "demeanor"就是boss标签的一个attribute,它包括两个部分:name,也就是demeanor,值,也就是被引号引起来的"friendly"。注意这个属性的值必须要用封闭的双引号或单引用引起来。

  由于LZX标签也对应Javascript的一个类,因此从语义上说"attribute"也对应着Javascript对象的property。下面的标签

<view height="20" width="30"/>

  创建了一个指定了height和width值的view对象。

  LZX中可以使用<attribute>标签来设置一个Javascript对象的属性。

<view name="myview"> 
  <attribute height="20"/> 
  <attribute width="30"/> 
</view>  

  上面两个例子中定义属性的方式是等价的,尽管这和XML定义属性的方式不同(后面一个例子),比如说height属性,还可以在script中以myview.height方式访问。

  您还可以使用<attribute>标签为您创建的一个新类定义新的属性,如下:

 <class name="froboz" extends="view"> 
    <attribute name="whatnot" value="17"> 
 </class>

  这里定义了一个名称为froboz的新class,它继承了view的所有属性并且还有一个自己的"whatnot"属性。


  我们看到属性能够在LZX标签中被设置(也就是赋值),也可以在script中使用setAttribute()方法对属性设置值。此外,属性值可以被读到,或者是被script中的getAttribute()方法得到。(方法在后面将谈到)

  假如有一个名叫johnny的view,这个view可以是在标签中或者script中创建的,暂且不管这个view是具体如何创建的。

使用如下的Javascript代码来设置这个view的高度为100个像素。

johnny.setAttribute("height", 100);

通过这种方式在Javascript中读取高度的值

johnny.getAttribute("height");

  当每次一个attribute被设置时,这个attribute的值都发生改变,同时会产生一个事件对家。下面部分介绍说明什么是事件以及在LZX应用中事件是如何工作的。

事件和方法

事件

  事件是应用中某些东西变化时对象之间交互的一种机制,具体说,当按键被按下或者是一个view被创建以及一个向服务器请求的数据返回结果时都会产生一个事件。

  LZX应用中,事件不是广播机制,而是使用delegates点对点地传播,当一个事件产生时,有一个最底下的点被引用。这种机制有一定的弹性并且减轻了使用事件的负担。在本章中我们对事件进行简单介绍,而不讨论使用delegate的具体问题。我们暂时只讨论当一个事件产生时会发生什么结果,而不管为什么会产生这种结果。

  view有几十个定义好的事件,在Reference文档中view部分有这些事件的列表。其中部分是处理用户输入,比如onblur、onkeydown,和Javascript应用很相似。另外一些事件,比如onheight、onwidth,当view对象的可视部分发生变化时产生。最后,当一个view 对象被创建时产生oninit事件。同样,另外一些系统定义的LZX对象比如Datasets(见后)也有一些事件和这些关联。

  事件和属性通常都是关联的,实际上,使用setAttribute方法设置属性的值时就会产生一个缺省的行为,即产生一个"on"+属性名的事件。比如,当一个view改变它的x 坐标,就以这个x属性的新值产生一个onx事件,这是除系统定义的事件之外的会产生事件的情况,对于自定义的属性也有效。注意,只有使用setAttribute方法更改属性值时才会产生,使用其它方式更改不一定会产生。

  当一个事件产生时,事件就带着包括该属性变化的相关信息作为一个单一的参数被发送,然后被关联的event-handler(如果设置了的话)捕捉。

  在本文档的其它部分我们会介绍LZX中事件如何被执行,以及应用设计中的事件机制,特别是在27章Delegates 介绍了事件和delegates之间的关系。

函数

  LZX中,一个Method 标签就是一个Javascript函数对象。它能够通过()操作符调用,如下:

<view name="dog">   
  <method name="bark"> 
  </method> 
</view>

  定义了一个叫bark的method,可以在script中直接调用

dog.bark();

  Javascript中,this关键词被用来引用函数调用时的调用对象。

事件

  handler就象一个method,但是method需要通过它的name被调用,而handler则当一个关联的事件发生时就被调用。handler的script代码在它对应的view接受到一个和它的name对应的事件时被执行,比如:

<view> 
  <handler name="oninit"> 
  </handler> 
</view>

定义了一个函数当这个view被创建时执行。

<view> 
  <method name="bark"> 
  </method> 
  <handler name="oninit"> 
    this.bark()  
  </handler > 
<view>

  当这个view被创建时,oninit事件产生并且调用同名的handler,然后handler部分的script被执行,最终调用引用对象的bark方法。handler也可以象下面这样直接在标签中定义:

 <view oninit="this.clickHandler()"> 
   <method name="clickHandler"> 
   </method> 
 </view> 

  有三种常见的method和handler

  oninit方法被调用当它们的父元素对象被创建时。

  handler被调用当它们的父元素对象收到一个对应的事件。

注意:您可以使用常用的Javascript语法定义一个方法。但是在LZX中尽量使用<method>tag方式定义。

约束

  LZX中约束是控制属性值跟随其它(不一定是自己的)属性值变化的功能。定义约束的代码如下:

$when{expression}

这里:

  * "$"符号是定义约束的标志

  * "when"是可以选择的标记,有以下值:immediately,once或者always,如果不选择则认为是always,即${expression}是$always{expression}的简写方式

  * 左大括号"{"和右大括号"}"标记约束中表达式的范围

  * "expression" 是Javascript的表达式语句

  就象前面我们所说的那样,无论什么时候属性的值发生改变时,它的on 事件就会触发,而约束决定了它的值依赖于其它的属性,因此当它接受到依赖的属性值的on事件时,就会重新计算约束的值。

考虑

<view  name="someView" width="${someAttribute + someOtherAttribute}" />

当onsomeAttribute或者onsomeOtherAttribute的事件产生时someView的width值都会重新计算,从而确保someView的width值随它约束的属性变化而变化。

例如:

 <view name="beatles" width="${this.paul.width + 28}"> 
    <view name="paul" onkeydown="keyhandler()" oninit="LzFocus.setFocus(this)"> 
    </view> 
 </view>

  beatles的宽度会随paul的宽度变化而变化,这里的"this.paul.width+28"就是一个约束表达式。

  当用户在paul上按键(即焦点在paul这个view上并且按键),keyhandler会调整paul的大小,这个改变最后会通知到${this.paul.width+28}这个约束,然后beatles view会重新计算(在新的paul的宽度基础上加28)。对于用户来说,这个过程是不可见的,因为这个过程瞬间就完成了。

词法和视图层级关系

  一个LZX应用是通过对象的层次关系来表示的,通常是可见的对象,这些对象都包含在一个Canvas的对象下。前面说过LZX 应用就是XML文档,这个Canvas就是XML文档的root元素,最简单的LZX应用如下:

 <canvas/>

  这个应用被编译和执行后,但看不到任何输出(因为它没有包含任何可视对象)。最简单的可视对象就是view,下面是一个简小的LZX应用

 <canvas>
   <view>
     <text> Hello World!</text> 
   </view> 
 </canvas>

  这段代码定义了三层的对象,我们可以通过给设置canvas和view的大小以及背景颜色来看到这种视觉上的层次关系:

  在这个简单的例子中,词法上的层次关系和视觉上的层次关系是一致的。实际上,<text>也是继承自<view>.典型Lzx应用都是这样的一个过程:canvas包含一些视图,然后这些视图又包含另外一些视图,这样一直下去形成多层的包含关系。类一般被用来产生相同结构的视图。

  LZX提供多种方式来简化视图中的关系,比如说提供了几种layout来管理视图之间的位置关系,这些在16章布局和界面设计介绍。

  但是在真正的应用中,应用代码文本中的视图层级关系和在canvas中视觉上的关系并不象这个简单例子一样是一致的,特别是LZX中强大的数据绑定可以让代码文本中单个的view标签产生任意多个的view对象实例。在这种情况下,需要更准确的描述对象之间的复杂关系。23章 视图更深入地讨论了这个。

词法作用域

  在LZX中,全局和局部作用域的概念基本和JavaScript是一致的。

  在Javascript中,所有的变量都是全局的,除非声明时加上var 关键词。

Thus

a = 7; // 定义一个全局变量a

and

var a = 7 // 定义一个局部变量a

for (a = 0; a <n; a++);

for (var a = 0; a <n; a++);

  在Lzx中,name属性是局部的,而id属性是全局的。

<canvas> 
   <view name="john" id="grandfather"> 
      <view name="john" id="father"> 
         <view name="john" id="son"/> 
      </view> 
   </view> 
</canvas>

  上面是有效的命名规则,最里面的view可以通过canvas.john.john.john(name)或者son(id)方式访问。

  在<script>标签中定义的函数,可以在应用的任何地方被访问。

数据绑定

  LZX被设计成易于编写数据驱动的应用,通过LZX的标签和API可以通过http访问数据,在内存中操纵XML数据,而且更深层的是可以将数据源的层次邦定到视图的层次上。

  下面部分概括了LZX中数据绑定技术的主要特点,Part V,数据和数据绑定更详细的介绍了这些

数据访问

  LZX应用可以操纵以下几种XML格式的数据。

  * 直接写在代码中的数据。

  * 当应用编译时从资源文件中读入的数据

  * 当应用运行时从资源文件中读入地数据。

  XML的数据源存储在dataset对象中,<dataset>标签有一些属性允许您控制数据源的方式。通过dataset标签创建的对象称做LzDatasets(在Javascript对应的class即为LzDataset),<dataset>标签的一些方法可以让你设置请求的参数(对于http方式访问的数据)等等。

数据操纵

  LZX使用datapointer,一个可以指向dataset中数据节点的指针对象,去定位并且操纵数据内容,Datapointer支持XPath(W3C中定义XML文档路径的标准)的一个子集,XPath 使用一个类似UNIX文件系统的符号去饮用dataset中的一个数据节点。Datapointer能通过调用比如selectNext()或者通过setXPath()方式发送一个XPath请求来移动。

  因为XPath结合了模式匹配,它的语法简练而强大。一个简单的XPaht的表达式可以对应任意数量的XML元素。使用addNode(),setNodeName(),setXpath()以及selectParent()等方法,您能创建或操纵XML数据结构。

数据绑定

  LZX提供了一种独到的方式让任意格式的数据和视图表现关联起来,这就是数据绑定。在显示界面上child的数据关系被它们parent的数据关系所决定。此外数据绑定机制能告诉系统如何去创建任意的视图层次来对应选定的数据中的每个元素。

  实现的方式是绑定视图到datapointer上。datapath是datapointer的一种特例,能清楚地将视图结构和数据结构结合起来,举个例子:

 <view name="bob" datapath="testdata:/*">

  这里"testdata"引用应用之前定义过的一个dataset。

  这可能有些抽象,因此我们在这里只做简单介绍,在Part V 数据和数据绑定部分 我们再详细讨论。

在lzx程序中结合标签和脚本

  前面提到过,几乎所有的LZX应用都包含了XML标签和Javascript脚本,标签以声明的方式使用(也就是在源代码文档中定义对象和属性),script以程序的方式使用(也就是明确定义一系列程序结构流程)。尽管在LZX中可以随便把这两种代码夹杂使用,比如说script可以写在标签内,只需要保证这个部分的语法正确。

  在LZX代码(标签)中可以使用如下方法表述注释:

  当在Javascript代码块中,注释需要这样使用

  但是LZX中的这两种混合方式更像是物理反应而不是化学反应。

  由于在应用中这两种方式可能会造成一些混乱,刚开始在应用中使用它们会觉得是需要一些技巧的,但是随着您经验的增加并且开始理解LZX根本的逻辑后你会发现对你没有什么影响。下面部分说明如何并且为什么要用这两种方式中的一种。


如何结合使用标签和脚本

  我们首先看看什么是可行的,什么是需要注意的。

什么是允许的

  所有的LZX应用都是格式良好的XML文件,也就是说程序中的每个部分,包括嵌入的Javascript,都必须遵循XML语法规则。因此如果Javascript使用了一些XML中特殊的字符,比如说"<"(左尖括号,Javascript中的小于符号),必须确保这些字符不会让XML解析器混乱,有两种方式可以解决:

  * 用实体引用(entity reference)替代这些字符(左尖括号的实体引用是"<")   * 使用XML的CDATA结构定义包含这些字符的块。比如

<![CDATA[
 for(var i=0;i<1;i++){};
]]> 

Javascript标签中的代码应该全部用CDATA引起来。

这里有几种规则确保XML不会影响Javascript。

什么是需要注意的

尽管两种不同的语言规则混合在一个语言中会导致混乱,但是还是很容易理解在LZX应用结构中这些代码应该放在什么地方,因为在Lzx应用中只有几个地方是可以放置Javascript代码的,一旦你理解了这些后就不大可能再被这些困惑了。Javascript可以使用的几个地方:

  * 在封闭的script标签之间,即<script>...</script>

  * 在封闭的method(handler)标签之间<method>...</method> <handler>...</handler>

  * 在双引号内并且作为确定的标签的属性值的值,比如oninit="script expression"

什么时候使用标签或脚本

  之前说过,大多数情况下都可以用XML标签或者JavaScript APIs之一实现,开发中什么时候该使用哪个需要深入的理解。您会发现,一般来说,标签适合编译时就确定的工作,比如说控制canvas上的视图布局,而script适合运行时的工作,比如说响应用户输入。 但是这些就需要您理解编译时和运行时系统的工作原理,这些都依赖于您在这个系统中解决的问题,因此需要一个探索的过程。

  换句话说,并没有简单的规则告诉你什么时候该用标签,什么时候该用script,但是能告诉你设计良好的LZX应用的一般法则。

  回想前面说的,LZX首先是一种为了操纵叫view的可视对象的语言,所以什么时候用标签或script的问题一般在创建view或者操纵它们的属性时才被提起。script能用来做其它的一些事情,比如作为全局函数,但是这样的例子中一般是写程序代码通常会更清晰一些。这些策略和具体如何操纵视图和它们的属性有关。

  举例来说,一个两个单词的约束也许能表达一个view之间的关系,而使用javascript也许需要30行的代码,这种情况下使用约束会更好,但不总是这样。

尽管没有绝对的规则,但是在LZX应用开发还是有一些普遍的规则:

  * 使用标签当只能使用它时

  * 使用Javascript当只能使用它时     * 如果既能用标签又能用script,尽量使用标签,除非有更好的理由说不能这样做。

这些原则具体如下。

使用标签当只能使用它时

  有几个确定标签的行使的功能是不能用script做到的,比如说每个LZX应用的root节点都是<canvas>,每个LZX应用都以<canvas>开始,以</canvas>结束,这是没有使用script替代方法的。类似还有method,attribute,resource等几个标签,此外还有几个特定的标签的特定属性只能在标签中设置(详细见编程参考手册)。

使用Javascript当只能使用它时

  有几个Javascript API的功能也无法通过标签实现,比如LzDelegate,lzParam等,同样的,有几个确定的对象的属性只能通过script引用,即使这个对象是使用标签创建的,比如

 <view name="franklin">

  有一个属性,franklin.subviews,能在script中访问,但是不能在某个tag设置一个属性访问。

如果既能用标签又能用script,尽量使用标签

  大部分的情况下,可以用标签和视图来做一些事情,但最好是用标签。例如:你可以通过view标签创建一个名为sam的新视图

<view name="sam">

  当您使用标签语法是您可以自然地创建subviews的层次关系,定义属性约束,排版代码以便容易看出canvas中视图的结构层次。而使用纯Javascript可能需要大量的代码,并且非常繁琐,等于是去掉了LZX语言中许多的优势。

除非有更好的理由不这样做

  有时写程序性代码比标价性代码会更好,有时甚至是必须的,比如,想达到最好的性能:太多的约束有时会成为CPU的负担。另外程序性代码可能会让应用的流程更容易理解:复杂的规则基础的视图系统有时是很难理解的。


                                       Home 

Prev                                                                     Next