You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
以上对象将在最终的 model 对象中生成 two 、 four 和 five 属性,而 one 、 two 和 three 因为属性值为普通对象或数组,将被忽略,其中one对应3个函数,将会把函数的返回值展开后添加到当前 model 同样,注意在嵌套的同时,各属性名不要相同,除非该属性名称没用,以避免出现数据相互覆盖的情况。
通过数据获取配置项
上面所述的各种方案,均是数据获取配置项的简写,一个数据获取配置项的结构请参考 meta/DatasourceOption.js。因此,可以使用数据获取配置项来处理一些例外情况,比如并行加载2个对象,且2个对象均无对应的键值,需要完整添加到 Model 对象:
首先上一张图:
ajax.js
此模块返回一个 ajax 对象,用于发送 ajax 请求,最主要的就是 request 方法。同时该对象上也会挂载 Ajax 构造函数。
返回的 ajax 对象上会带有一个钩子属性( hooks ),钩子属性上包含的类容可能有:
request() 函数只有一个 options 对象参数,其属性如下:
json
的话,则会对 xhr.responseText 做 JSON 解析request() 函数的 options 参数上还可能混入其他一些参数,这些参数都是通过 xhr.config 来配置的,是 ajax 对象的全局配置,这些属性包括:
ajax 对象上除了 request 方法,还有如下一些方法:
Action.js
Action 类,用于构造 action 对象。action 代表一种动作,比如页面跳转、鼠标事件、键盘事件等,都可以产生一个 action。
action 上会附着 model 和 view,进入 action 的时候,会先去加载 model 指定的数据,然后根据拿到的数据来渲染 view 指定的视图。
任何一个有 enter() 方法的对象都可作为 action 对象。
enter() 方法开启了 action 的生命周期,在 action 的生命周期中,会触发如下事件:
action 生命周期相关的一些方法:
Model.js
MVC 中的 Model,主要用于从后端取数据,然后提供一些方法管理取到的数据。其中 load() 方法用于取数据,该方法会根据当前 model 对象上的数据源对象( model.datasource )去后端取数据。
数据源是对数据一系列配置,其中保存了多个数据的获取函数,有以下方式:
单一数据源配置
如果
datasource
是一个函数,则认为该函数是一个数据获取函数,执行该函数,并把返回值按照一个对象放到当前 model 中
并发请求数据
通过一个对象配置并发的数据获取。对象中每一个属性对应一个获取函数,
当数据获取后,会调用
this.set(name, result)
,以属性名为键值添加串行请求数据
通过一个数组配置并发的数据获取,数组中包含对象。将按照数组的顺序,
依次加载每一个对象(对象中的各属性是并发)
注意使用该方案时,各对象中的键不要相同 ,否则会造成数据的覆盖
嵌套配置
数组和对象可以相互嵌套,但有一个限制:
以下为一个串行和并行混杂的数据源配置:
以上对象将在最终的 model 对象中生成
two
、four
和five
属性,而one
、two
和three
因为属性值为普通对象或数组,将被忽略,其中one
对应3个函数,将会把函数的返回值展开后添加到当前 model 同样,注意在嵌套的同时,各属性名不要相同,除非该属性名称没用,以避免出现数据相互覆盖的情况。通过数据获取配置项
上面所述的各种方案,均是数据获取配置项的简写,一个数据获取配置项的结构请参考 meta/DatasourceOption.js。因此,可以使用数据获取配置项来处理一些例外情况,比如并行加载2个对象,且2个对象均无对应的键值,需要完整添加到
Model
对象:对于不同的简写,其与数据获取配置项的对应关系如下:
{ retrieve: {fn}, dump: true }
{ retrieve: {fn}, name: {name} }
View.js
在 aciton 的生命周期中,加载完 model 数据之后,就会渲染视图了,此时调用的是 view.render() 方法,也就是说 view.render() 就是 view 的入口函数。er 的视图默认使用 etpl 模版引擎渲染。
在指定容器内渲染出 html 结构之后,就会调用 view.enterDocument() 方法,用于控制元素可见性及绑定事件等DOM操作。比如利用 esui 来初始化各种控件等等。
controller.js
控制器类,负责 URL 与 Action 的调度,将 URL 映射到具体的一个 action 的执行上。
可以使用 controller.registerAction() 方法来注册 action 配置,配置数据放在 controller.actionPathMapping 属性上( path 到配置对象的映射 )。每一个配置对象包含以下属性( actionConfig ):
当路径改变时,会调用 controller.renderAction() 方法,此处渲染的是主 Action。渲染之前,会去 controller.actionPathMapping 上查找相应的 action 配置,如果找不到,则会跳转到404 url(404 url 可以通过 controller.setNotFoundLocation() 来设置);如果没有找到404对应的 action 配置,则会 reject。判断完 action 配置是否存在之后,会检查是否有权限访问这个 url,如果没有权限,则会跳转到没有权限的页面(此页面可以通过 controller.setNoAuthorityLocation() 设置)。
在 action 的渲染过程中,会伴随一个 actionContext 对象,里面包含如下属性:
controller 对象有一个 eventBus 属性,该属性是 mini-event.EventBus 的实例。在此实例上,会有如下一系列事件触发:
对于当前 url 加载到的 action 模块对象,如果是一个函数,则认为是一个 Action 构造函数,直接实例化;如果是一个包含 createRuntimeAction() 的对象,则认为这个 createRuntimeAction() 函数就是一个 Action 工厂函数,调用该工厂函数就可以创建出 action 对象;否则认为这个模块对象就是 action 实例。
找到了当前 url 对应的主 action 之后,就要开始进入这个 action 了。在进入之前,需要销毁之前的主 action(调用 action.leave() 方法)。销毁之后,调用 action.enter(),进入当前 action。
The text was updated successfully, but these errors were encountered: