1、动态填充dijit.form.MultiSelect
MultiSelect不支持dojo.data(即datastore),所以如果想把一个datastore动态填充进去,只能写一些javascript代码来动态创建那些<option>标签,基本上是通过myDataStore.fetch()来实现的。这个链接(Populating markup MultiSelect)值得参考。
2、强制一个datastore从url里取得数据
myDataStore._forceLoad();
3、当datastore含有嵌套结构的时候,datastore.fetch()报错“dojo _48 is undefined”
原因是在得到的json串里包含了"identifier"的声明,但嵌套结构里有一些对象没有包含所声明的属性。解决的方式1、让所有对象都包含该属性,2、去掉"identifier"声明(推荐1,因为我猜去掉这个声明后,在一些控件里将无法映射id值到html代码)参考链接1 参考链接2
4、在dojo中响应事件
5、刷新BorderContainer
有时需要动态隐藏BorderContainer里的一些区域(如left),若近将该区域的style.display设置为"none",则该区域所在的部分将变为空白,其他区域(如center)不会自动占领它原来的屏幕空间。这时需要调用dojo.byId('myBorderContainer').layout()方法手动让dojo重新计算一次布局,其他布局类似。一个相关链接(仅针对旧版本dojo)
6、用dojo画统计图(柱图,饼图等)
见这个教程:A Beginner's Guide to Dojo Charting (Part1, Part2)
7、程序改变dijit.dialog的标题
dijit.dialog并没有提供一个"setTitle"方法来控制标题内容,但可以通过dijit.byId('myDialog').titleNode.innerHTML='My New Title'来实现。参考链接
8、BorderContainer里各个pane的显示和隐藏
利用dojox.layout.ExpandoPane(尚不确定是否为experimental),使用的例子见这个链接。
9、将ItemFileWriteStore序列化为JSON字符串
10、dojo的XHR(XmlHttpRequest) 里,handleAs可以有以下取值:
text (default), json, json-comment-optional, json-comment-filtered, javascript, xml
11、将DataStore里的数据以XHR方式发给服务器,并处理返回值
在js里这样写:
dojo.rawXhrPost({
url: " http://127.0.0.1:8080/myapp/myservlet " ,
handleAs: " text " ,
postData: data,
headers: { " Content-Type " : " application/json " },
handle: function (data, args) {
if ( typeof (data) == " error " ) {
alert( " Error run analysis " );
} else {
alert( " Successed run analysis " );
// do with result data
}
}
});
在myservlet里用下面的方法得到js传过来的json字符串,然后可以用任何java的json包来做解析和处理了:
StringBuffer json = new StringBuffer();
String line = null ;
try {
BufferedReader reader = request.getReader();
while ((line = reader.readLine()) != null ) {
json.append(line);
}
} catch (Exception e) {
System.out.println(e.toString());
}
return json.toString();
}
12、使用xhr的时候,如果不是在本机访问,可能会遇到“Access to Restricted URI Denied”的提示。
一个可能的原因是xhr里的url的domain与访问者浏览器(或其他什么,这里没搞很清楚)的domain不一致,如果是这个原因,只要在url里使用相对路径就可以了。比如原来url是“http://127.0.0.1:8080/myapp/myservlet”的,改为“myservlet”即可。如果不是这个原因,这个链接可以参考一下。
13、dojo里的单击事件是“onClick”,写成“onclick”不认。(但onchange是全小写,够奇怪)
14、把json格式的数据画到dojo chart
下面是一个把json数据转换到数组的例子,来自这个链接,实际上是利用prototype的能力。
str = “{values: [ 1 , 2 , 3 , 4 , 5 ]}”;
// using prototype
obj = str.evalJSON();
// the array is then referenced by:
chart1.addSeries(”Series 1 ″, obj.values);
下面这种方式则直接使用了json格式(来自这里),但关于valueFn这个参数的使用方法我还没找到一个比较完整的介绍:
theme = " dojox.charting.themes.PlotKit.green "
style = " width: 300px; height: 300px; " >
< div class = " plot " name = " default " type = " Pie " radius = " 100 "
fontColor = " black " labelOffset = " -20 " >< / div>
< div class = " series " name = " Series C " store = " tableStore "
valueFn = " Number(x) " >< / div>
< div class = " action " type = " Tooltip " >< / div>
< div class = " action " type = " MoveSlice " shift = " 2 " >< / div>
< / div>
15、可伸缩的pane
使用ExpandoPane(//测试链接TODO)即可实现。要注意的是,ExpandoPane在dojo 1.3之前的版本里有bug,现象是包含抽屉pane时在IE下最下面的抽屉会被挤掉,在Firefox里则正常。dojo 1.3解决了这个问题。
(如无特别说明,以上均针对dojo 1.3版本。 )
(以下为dojo 1.6版本,dojo总是让人抓狂,一些好不容易获得的经验不得不快记下来)
16、 dojo chart的legend(图例)必须在chart.refresh()以后创建或refresh(),否则图例里不会正确显示颜色和形状,而是都为"X"。(参考链接)
17、 在tabcontainer里画的chart,refresh()的时候所在tab页是隐藏状态,切换过去后chart的尺寸不能充满tabcontainer区域。
还不知道正确的方法是什么,一个权宜之计是在tab切换到chart所在tab时,调用一下chart的resize()方法,例如下面这样:
if (child.id == " myTab " )
myChart.resize();
});