Action.enter的建议
Closed this issue · 17 comments
在使用ER的时候,遇到了一些使用不便的地方,在这里说一下
- ER 里面的
Action
、Model
、View
没有构造函数初始化,不方便做初始化工作 - 消息类事件监听不方便(onxxx的方式不好)
Model.load
、Deferred
实现不友好,调试很不方便model.datasource
请求不方便携带参数Model.prototype.prepare
应该要先调用,而且应该有返回值,再执行fill
或set
Action.enter
的时候接口较少,不方便扩展Action.prototype.enter
中,createModel
带了参数,后面就不需要再次fill
了Action.prototype.forwardToView
中连续的三个操作this.fire('rendered')
、this.initBehavior()
、this.fire('entercomplete')
可以合到一起了
- 已有计划,马上会为这3个加上
initialize
方法 - 不是有
.on('xxx', handler)
吗? Promise
是业界标准,还请接受,对于调试可以通过Deferred.prototype.syncModeEnabled = true
来提供调用堆栈信息,但不要打开此开头的情况下上线- 为何不方便携带参数?你的代码提供一下吧
- 不理解,
prepare
的定义是在“数据源加载完后,在真正可用前,对加载的数据做进一步的处理”,你所需要的“先调用”是指在什么方法之前? - 不太理解,你还希望哪些方面的扩展性?比如需要哪些额外的参数?
- 在开发分支上已经去除了
- 合到一起是指?在一些关键的方法前后有对应的事件是一种设计的理念
(2) 如果ER会自动完成一系列的工作,on('event', handler)
的入口在哪里或者或者在哪个阶段去监听呢
(3) Promise肯定没有问题,只是感觉调试有些麻烦
(4) 数据源是比较复杂的设计,真正的请求函数只传递了model
和datasource
进去,没有参数吧
(5) model.load
成功响应之后就做prepare
处理,完成后自动填充进model
里,就不用手动去set
了
(6) 比如model.load
之前可能要做一些事情,渲染页面布局或框架之类的
(8) 嗯,是说这三个函数可以合并成一个消息事件
还是发svn看看比较方便,顺便学习学习
2.可以用er/events
的``事件,这个事件在enter()
调用之前触发,是个比较好的时机
-
你的参数具体是指什么,因为框架能给你的肯定只有
model
和datasource
,如果有些参数是你自己获取的,可以用闭包:var x = 1;
var y = Math.random();datasource: {
foo: function (model) {
return x + y;
}
} -
你的意思是
prepare
有返回值,然后这个返回值(一个对象?)填充到Model
中吗? -
注册
Action
的enter
事件,这个事件在Model
创建之前,符合你需要的时机 -
不是太理解……3个函数中有2个是事件,1个
initBehavior
是明显有逻辑的,合并成一个消息事件是指直接就只有一个事件,没有initBehavior
这个提供重写的点了?
(1) er/events
监听需要扩展到实例里面去;自定义子类中也可以监听,但是比较麻烦。
(2) 有个参数可以接受原始数据,经过处理,返回的数据自动set
进model
里。
(3) enter
有点过早,view
、container
这些还没有初始化。
(4) 不论预留的接口是initBehavior
还是fire('event')
这三代码逻辑可以由一个接口去完成
能不能提供一个生成子类的方法啊?比如:
var ListAction = Action.extends({
viewType: require('xxx'),
modelType: require('xxx'),
...
});
每次都是先require一大堆,重写一大堆,继承。。。心情很烦躁啊有木有!
或者是由edp add提供这个功能,快速新建一个action-model-view-etpl
edp add er-aciton list
自动生成这些文件
- List.js
- ListModel.js
- ListView.js
- list.tpl.html
那些继承基类的代码自动给搞好
er/events监听需要扩展到实例里面去;自定义子类中也可以监听,但是比较麻烦。
你希望是怎么样的代码,是否可以给个示例的代码,我们再来看看怎么去支持
有个参数可以接受原始数据,经过处理,返回的数据自动set进model里。
所以还是想看下代希望的代码是怎么样子的……
enter 有点过早,view、container 这些还没有初始化。
Model
在View
之前,这是ER的机制决定的,你想要一个在load
之前,又要在View
之后,那ER无法提供了
我很理解你的需求,不过刚好是和ER不一样的一种交互方式。我并不太希望ER去支持2种路线,所以为此可能我会考虑插件或者别的机制,容我思考
不论预留的接口是initBehavior还是fire('event')这三代码逻辑可以由一个接口去完成
有点想不明白,求下你的代码,如何一个接口来完成,或者提交pull request也行
我们和ef的完全一样
src/
plan/
List.js // 这是aciton
ListModel.js // 这是model
ListView.js // 这里view
那么这个后续作为edp-codegen的插件来做一下吧:)
是否可以这样考虑,提供一个接口,扩展父类
var ChildAction = Action.extend({
// 初始化方法
// 在 Action.apply(this, arguments) 之后调用
initialize: function() {
// 注册ER的消息事件
this.on('enter', handler);
}
});
对于Action.enter
,在 Action.forwardToView
里面最后的处理中,留一个接口
this.fire('rendered');
后面两个方法
this.initBehavior();
this.entercomplete();
使用者可以在rendered
的监听中处理。
是否可以这样考虑,提供一个接口,扩展父类
上面说了,我认为这事不应该ER提供,考虑单独的库来吧……
对于Action.enter,在 Action.forwardToView里面最后的处理中,留一个接口,后面两个方法
这似乎就是把我的fire('entercomplete')
改成了entercomplete()
方法?但原来的事件也能加个onentercomplete
方法,多个事件的缺点是什么……?
只有一个方法,意味着只能重写一次,而事件本身是多播的有明显优势,至少管家现在就有不下3处注册了entercomplete
事件的地方,用来记录日志、作导航条具体item高亮等工作
上面说了,我认为这事不应该ER提供,考虑单独的库来吧
恩,单独的库吧。
ub-ria-tool
有没有必要改吧改吧,弄成edp的扩展?例如edpx-ub-ria
,然后就可以用edp ub-ria
的方式来使用了,然后也就可以弄edpx-ma-ria
的扩展了。
嗯,会的,等我这阵子杂七杂八的事结束了,或者我找到人来搞这个……
那我来找人搞吧,这样子发布1.0.0的时候,能多打包点儿东西~~~
这个问题还有进一步的讨论吗?考虑在近几周发布3.1.0 beta
版,之后对新的功能需求会很谨慎地去接受