Dorado 7.1 新功能说明

告别“this”



总是为this在回调方法中的指向问题而困扰么?现在我们可以抛弃它了。Dorado7.1在所有的事件监听器中提供了一个view隐式变量指向当前事件宿主所属的View,此变量可以完全替代原先this的使用场景。它可以带来以下几个好处:

  • 语义明确,很明显 view.get("#dsPeople") 比 this.get("#dsPeople") 更加准确的表达了代码的含义。
  • 不用再担心进入闭包和回调方法之后this的指向发生变化。
  • 即使是在控件的onCreate事件中也可以使用view隐式变量。而在之前的版本中,onCreate事件里this的指向是事件宿主自身,与其他事件并不相符。

自动对象注入



此功能相当于客户端的智能方法适配,Dorado7.1可以根据事件监听方法的参数定义自动为这些参数注入数值。
例如我们在View中定义了一个名为dsProple的DataSet和一个名为buttonOk的Button,只要这样定义事件的监听方法,Dorado就会自动将dsPeople和buttonOK的实例注入到方法中,这下子我们就不需要再写那么多 this.get("#xxx") 了,例如:

function (dsPeople, buttonOk) {
	... ...
}

此处可以自动注入的对象不仅包括View中的控件,也包含DataType。同时,如果您希望继续使用self和arg参数,只要也把它们定义在方法参数中就可以了,顺序无所谓。

新版的IDE也将根据Dorado7.1的这一特性对事件编辑界面进行一定的调整,允许用户自定义方法的参数声明。见下图:

Javascript Controller



Javascript Controller是一种新的代码管理方式。可能您已经发现了,要看懂一个view.xml文件中究竟定义了哪些事件声明是一件十分麻烦的事情,你必须不断的点击各个控件去查看各个事件下的代码。这种零散的代码组织形式给视图的维护带来了很多不便。

Javascript Controller的做法是把所有的事件代码集中到一个和view.xml同名同位置的js文件中,同时利用Javascript中的"Annotation"来完成事件的挂接。见下例:

/** @Bind #buttonOK.onClick */
function buttonOK() {
	alert("buttonOK Clicked.");
}

/** @Bind #dsPeople.onReady */
function dsPeopleReady(dsPeople) {
	dsPeople.insert();
}

@Bind后面的表达式与View.get()方法中的表达式高度相似,所以我们也可以利用这种"Annotation"批量的为一组控件定义事件:

/** @Bind ^readOnlyEditor.onCreate */
function setReadOnly(self) {
	self.set("readOnly", true);
}

并不是只有与View同名的js文件可以成为Javascript Controller,所有通过View的javaScriptFile属性装载的js文件都支持这种声明。

另外,在Dorado7.1中View附带的js和css文件都将可以支持EL表达式,例如:

/** @Bind view.onReady */
function onReady(self) {
	alert("${request.getRequestURI()}");
}

匿名事件监听器



很多时候我们可能会觉得为每一个事件监听器命名是一件费心又麻烦的事情。而且,在大部分情况下这个方法的名称是没有任何实际作用的。出于这种考虑,Javascript Controller提供了对匿名事件监听器特别支持,上面的几个绑定的示例,我们都可以简化成下面的形式:

/** @Bind #buttonOK.onClick */
!function() {
	alert("buttonOK Clicked.");
}

/** @Bind ^readOnlyEditor.onCreate */
!function(self) {
	self.set("readOnly", true);
}

/** @Bind view.onReady */
!function() {
	alert("${request.getRequestURI()}");
}

声明式公用方法



有些时候,我们可能会在Javascript Controller文件中定义一些公用的方法。例如:

function showMessage(text) {
	dorado.MessageBox.alert(text);
}

/** @Bind #buttonOK.onClick */
!function() {
	showMessage("buttonOK Clicked.");
}

这看起来很简单,但是我们能否在view.xml里的某个事件声明中使用showMessage()呢?答案是可以,不过你必须要在showMessage()上添加额外的标注。

默认情况下Javascript Controller中的所有方法都是私有的,外部不可见的。同时Dorado7.1提供了两个"Annotation"用于声明方法的可见性——@View和@Global。@View用于标注某个方法在View中可见,@Global用于标注某个方法全局可见。例如:

/** @View */
function showMessage(text) {
	dorado.MessageBox.alert(text);
}

此时showMessage()已被注册成了当前View对象的一个方法,我们可以在其他地方(包括view.xml中或其他js文件中)通过 view.showMessage() 来调用它了。

@Global的作用的是把方法标注成全局方法,我们可以在其他地方直接通过 showMessage() 来调用它。不过由于Dorado7支持在单页面中出现多个View实例,为了避免可能出现的方法被相互覆盖的风险,我们强烈推荐首先考虑使用@View,@View可以在几乎所有场景下替代@Global。

兼容性声明

在Dorado7.0中,View附带的js文件中定义的方法默认都是全局方法,而在Dorado7.1中这些js文件默认都将按照Javascript Controller来解析,这会导致该js文件中所有的方法都变成私有方法,这必然会引起外部调用报错。解决的方法有两个:

  1. 给所有需要提供给view.xml等外部调用的方法添加@View或@Global标注。
  2. 在home:configure.properties中添加这样一行配置 view.javaScript.asControllerInDefault=false 。这样,所有的js文件默认将不会按照Javascript Controller来解析。除非,我们在该js文件的开头添加@Controller标注。

例如:

/** @Controller */

/** @Bind #buttonOK.onClick */
!function() {
	alert("buttonOK Clicked.");
}
Back to top