使用Dojo Toolkit中的问题和解决

file

本文记录使用dojo toolkit进行前端开发过程中遇到的问题和解决方法。

1、动态填充dijit.form.MultiSelect

MultiSelect不支持dojo.data(即datastore),所以如果想把一个datastore动态填充进去,只能写一些javascript代码来动态创建那些

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中响应事件

请参考:JavaScript events and 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字符串

var foo=dojo.data.ItemFileWriteStore._getNewFileContentString();

10、dojo的XHR(XmlHttpRequest) 里,handleAs可以有以下取值:

  • text (default)
  • json
  • json-comment-optional
  • json-comment-filtered
  • javascript
  • xml

参考链接

11、将DataStore里的数据以XHR方式发给服务器,并处理返回值

在js里这样写:

var data = scenarioEntryStore._getNewFileContentString();
 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包来做解析和处理了:

private String readJSONString(HttpServletRequest request) {
    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的能力。

//JSON:
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这个参数的使用方法我还没找到一个比较完整的介绍:

<div dojoType="dojox.charting.widget.Chart2D" id="chart4" 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()方法,例如下面这样:

dojo.subscribe("myTabContainer-selectChild", function(child){ if(child.id=="myTab")
        myChart.resize();
});