Dorado 5 : 6.2.Namespace (RF1)

Dorado JSP开发时支持一个页面引用多个视图模型,也支持一个视图模型被同一个jsp引用多次。由于视图模型中dataset以及组件id属性的唯一性使得很可能会在不同的视图模型的JavaScript之间产生混淆,如定义一个视图模型:

<?xml version="1.0" encoding="UTF-8"?>
<view>
<Dataset id="dsEmployee" type="AutoSql" originTable="employee" keyFields="employee_id">
......
</Dataset>
<Controls>
<Control id="tableEmployee" type="DataTable" />
<Control id="btnAppend" type="Button" value="新增记录">
<Events>
<Event name="onClick">dsEmployee.insertRecord();</Event>
</Events>
</Control>
</Controls>
<Properties />
</view>

在JSP中重复引用该视图模型:

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://www.bstek.com/dorado" prefix="d" %>
<html>
<head></head>
<body>
<d:View config="sample.newFeature.Employee" namespace="ns1">
<d:DataTable id="tableEmployee" />
<d:Button id="btnAppend" />
</d:View>

<d:View config="sample.newFeature.Employee" namespace="ns2">
<d:DataTable id="tableEmployee" />
<d:Button id="btnAppend" />
</d:View>

<d:View config="sample.newFeature.Employee" namespace="ns3">
<d:DataTable id="tableEmployee" />
<d:Button id="btnAppend" />
</d:View>
</body>
</html>

可以看到在该JSP中tableEmployee与btnAppend对象再加上不可见的dsEmployee对象等都发生了重复,更为不好处理的是btnAppend的按钮事件:

dsEmployee.insertRecord();

运行时该事件不知道该定为到哪个试图模型中的dsEmployee对象。
dorado通过命名空间的方式有效的避免了各个视图模型的JavaScript之间的相互混淆和冲突!
使用时JSP定义修改如下:

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://www.bstek.com/dorado" prefix="d" %>
<html>
<head></head>
<body>
<d:View>
<d:View config="sample.newFeature.Employee" namespace="ns1">
<d:DataTable id="tableEmployee" />
<d:Button id="btnAppend" />
</d:View>

<d:View config="sample.newFeature.Employee" namespace="ns2">
<d:DataTable id="tableEmployee" />
<d:Button id="btnAppend" />
</d:View>

<d:View config="sample.newFeature.Employee" namespace="ns3">
<d:DataTable id="tableEmployee" />
<d:Button id="btnAppend" />
</d:View>

</d:View>
</body>
</html>

而btnAppend事件中的代码修改如下:

var dsEmployee = ${Script.getViewModel()}.getDataset("dsEmployee");

通过使用EL表达式,使得按钮能自动根据自己所处的命名空间获得对应的客户端的JS视图模型对象。
JS视图模型对象:一般情况下我们不需要访问该对象,但是对于一个Namespace类型的页面中,我们维护dorado中的Dataset以及ViewProperties等等与视图有关系的对象时,就必需通过ViewModel设计时指定的命名空间加以区别。
当然也可以按钮的onClick事件也可以直接通过命名空间访问:

var dsEmployee = getViewModel("ns1").getDataset("dsEmployee");