基于 Dojo toolkit 实现 web2.0 的 MVC 模式-3 简化代码
 
- UID
- 1066743
|

基于 Dojo toolkit 实现 web2.0 的 MVC 模式-3 简化代码
第三部分 使用 dojo 的 subscribe 和 publish 方式简化代码由于 dojo1.2 版本已经提供 subscribe/publish 消息通知机制,所以可以将 model 与 view 的关系使用 subscribe/publish 机制来简化。简化后 model 被 subscribe/publish 机制中的 topic 代替 .
下面为简化后的代码。
清单 19. 修改后的 VIEW.js1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| if (!dojo._hasResource["taas._base.View"]) {
dojo._hasResource["taas._base.View"] = true;
dojo.require("dijit._Widget");
dojo.require("dijit._Templated");
dojo.provide("taas._base.View");
dojo.declare("taas._base.View",null,{
_model:null,
topic:"",
_taasSrcPath:dojo.moduleUrl("taas",""),
responseObject:null,
refresh:function(object){
this.responseObject = object;
if(this.updateView!=undefined&&typeof this.updateView=="function"){
this.updateView(this.responseObject);
}
},
bindModel:function(dataModel){
this._model = dataModel;
},
_bindTopic:function(){
if(this.topic!=undefined&&this.topic!=""){
dojo.subscribe(this.topic,this,"refresh");
}
}
});
}
|
清单 21. 修改后的 Controller.js1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
| if (!dojo._hasResource["taas._base.Controller"]) {
dojo._hasResource["taas._base.Controller"] = true;
dojo.provide("taas._base.Controller");
dojo.declare("taas._base.Controller",null,{
});
taas._base.Controller.remoteUpdate = function (dataModelUri,topic,requestContent){
_topic = topic;
_dataModelUri = dataModelUri;
_requestContent = requestContent;
console.debug(_requestContent);
var doResponse = function (responseText){
dojo.forEach(_topic,function(item){
var jsonObj = dojo.fromJson(responseText)[item];
//console.debug(dojo.toJson(jsonObj));
dojo.publish(item,[dojo.toJson(jsonObj)]);
});
};
var getFormJson = function() {
dojo.xhrGet({
url: _dataModelUri,
preventCache: true,
content:_requestContent,
handleAs: "text",
method:"get",
load: doResponse
});
};
var getFromForm = function() {
dojo.xhrGet({
url: _dataModelUri,
preventCache: true,
form:_requestContent,
handleAs: "text",
method:"get",
load: doResponse
});
};
var doRequest = function () {
if(dojo.isObject(_requestContent)) {
getFormJson();
}
else if(dojo.isString(_requestContent)){
getFromForm();
}
};
doRequest();
}
}
|
如何使用1
2
3
4
5
| <input type="button"
onclick='taas._base.Controller.remoteUpdate (
'http://localhost:8080/servlet/ProjectManagement ' , ["projects"], {
'action' : 'querybyuserid'
});”
|
清单中代码中 onclick 属性调用了 Controller 的 remoteUpdate 方法,该方法将调用远程 servlet 的 doGet/doPost 方法,并将相应的请求参数发给远程 servlet。远程 servlet 收到请求后进行相应的业务逻辑处理,最后将处理结果返回到 controller 的回调函数执行从而刷新视图。 |
|
|
|
|
|