-
Notifications
You must be signed in to change notification settings - Fork 15
BaseAction 指南
mvc/BaseAction
/ mvc/BaseModel
/ mvc/BaseView
中封装了对 er/Action
/ ef/UIModel
/ ef/UIView
的基本扩展。
back(isForce)
back(defaultURL, isForce)
用来增强返回的行为,默认行为是:
如果 actionContext
中记录了 referrer
则通过 action.redirect
跳转到 referrer
;否则跳转到一个可选的默认路径 defaultURL
上。
如果 referrer
和 defaultURL
都为空且 isForce
为真值,会直接调用浏览器的返回功能(location.back()
,比如是从其他页面而非其他 Action 进入本页时)。
BaseModel
提供了 defaultDatasource
的配置共列表、表单基类使用,在 load
时会把 defaultDatasource
和开发人员在业务数 Model 中配置的 datasource
合并。
bat-ria 扩展的 Action 在作为子 Action 出现时有一个约定:模板文件中必须有以原 target 名称 + _child
结尾的 target。例如如下 Action 弱需要出现在子 Action 时:
<!-- target: some_action -->
I'm a normal action.
必须增加如下 target:
<!-- target: some_action_child -->
I'm in child action.
如果两者需要有相同模板,则可以直接进行 import
:
<!-- target: some_action -->
I'm a normal action.
<!-- target: some_action_child -->
<!-- import: some_action -->
showToast(content, options)
显示全局提示信息。
content
- 需要显示的内容。
options
- 可选,需要传递给 esui/Toast
的其他配置。
popDialog(options)
创建新对话框并弹出。返回 Dialog
实例,需要自行绑定 ok
/ cancel
事件进行回调处理。
options
- 传递给 esui/Dialog
的配置。其中重要的项有 content
/ title
。
waitDialog(options)
waitDialog(dialog, options)
将新创建的对话框或已指定对话框弹出,返回一个 Promise
对象,其状态在对话框触发 ok
事件时(点击确定)会成为 resolved,触发 cancel
事件时(点击取消)会成为 rejected。用来处理需要等待用户确认且内容比较复杂的弹框,并且方便组合到基于 Promise 的异步流程中。
dialog
- 已经初始化好的 esui/Dialog
实例。
options
- 传递给 esui/Dialog
的配置。其中重要的项有 content
/ title
。
例如在提交前触发确认,确认后返回:
// action
this.view.waitDialog(options).done(function () {
return this.model.submitRequester(data);
}).done(function () {
this.view.showToast('Succeeded!');
this.back('/ad/list');
}).fail(function () {
this.view.alert('Failed!');
});
waitDialog(options)
waitDialog(dialog, options)
将新创建的对话框或已指定对话框弹出,返回对话框实例。
dialog
- 已经初始化好的 esui/Dialog
实例。
options
- 传递给 esui/Dialog
的配置。其中重要的项有 content
/ title
。除此之外,确定及取消时的处理函数需要通过 options.onOk
与 options.onCanel
传入。根据处理函数的返回值,对话框的关闭将会采取如下机制:
- 若返回值为
false
,不关闭。 - 若返回值为
mini-event/Event
对象,如果调用过preventDefault
方法,则不关闭。 - 若返回值为
Promise
对象,则在 resolve 时关闭。
在 View 中判断结果:
// view
this.showDialog(dialog, {
onOk: function () {
if (someCondition) {
return false; // 不关闭
}
}
})
View 中抛出事件,在 Action 中处理逻辑:
// view
this.showDialog(dialog, {
onOk: function () {
return view.fire('confirm');
}
});
// action
this.view.on('confirm', function (e) {
if (someCondition) {
e.preventDefault(); // 不关闭
}
});
View 中抛出一个事件后续要进行异步操作(比如发请求进行数据验证),再决定是否关闭对话框:
// view
this.showDialog(dialog, {
onOk: function () {
var pending = new Deferred();
view.fire('confirm', {
pending: pending
});
return pending;
}
});
// action
this.view.on('confirm', function (e) {
model.submitRequester().then(function () {
e.pending.resolve(); // 关闭
}, function () {
e.pending.reject(); // 不关闭
});
});