Comments (33)
考虑到一个Action中可能会包含多个popupAction,还会有一个popupAction中包含另一个popupAction的情况,是不是需要提供类似parentAction的参数做关联?或者 isChildAction 这个就换成 parentAction?
from er.
@DDDBear parentAction
的作用是什么?
我的最终目标是,一个Action无需关心自己是否为 chidAction ,由框架来做平滑的过渡,因此当加载一个子Action时,父和子Action之间的交互应当是 由子Action开放事件和方法,由父Action监听事件并调用方法 。
在这种设计下,子Action完全不需要知道父Action的存在,只要明白 自己会被其它地方接入 而因此 开放足够的接口 即可。
在现有的产品线下,是否有具体的业务需求场景,用以上的 父 -> 子 的单向依赖关系无法解决,而必须改为双向知晓和依赖的场景?
from er.
@otakustay 看了下我们这边的产品代码,我之前实现的确实是“子嵌套”的概念对于Action本身是透明的,url跳转所涉及的对子Action的同步销毁也是在controller里进行。唯一需要分父子情况考虑的就是那些Action内部的链接元素,处理方法跟你说的是一样的。不过后期期待的改进就是能够把这一步也抽取到外部来统一实现。
from er.
@DDDBear 在你们的开发过程中,子Action和父Action的区别有哪些,我总结了2条:
- 不能使用
<a>
元素或locator.redirect
来直接修改URL中的hash,要管理起来转为另一个renderChildAction
的执行 - 不能从URL中通过 isModify 等关键字来判断Action的类型
还有没有别的,麻烦一起总结一下
from er.
@otakustay 其实只要是涉及使用地址栏url的都要区分处理。比如截图工具中页面设计成tab形式,而tab的切换原始就是通过变换url实现的,后期为了支持popupAction才增加了通过actionName做跳转。
所以当时有过一种想法就是不要再有什么er.locator.redirect(this.tabs[index].location);这种直接修改location的操作,而是提供一个通用的方法,然后通过判断Action是子还是父来在Controller中做分发处理。至于如何判断一个Action是子还是父,则可以在创建Action的时候传入相应的标志。
from er.
我的设想是这样的:
- 对于URL这事,现在的ER框架中,在Action里
this.model.get('url')
是可以取到当前关联的URL的,而且这个URL不一定和地址栏上的一样,是真正 进入到这个Action 时的URL,因此 isModify 这样的判断可以不用location.hash
了 - 对于重定向,有一个办法是给
Action.prototype
加一个redirect
方法,当controller发现是子Action的时候,会把这个方法重写掉,不过这个方法从框架的结构上来说不那么舒服,是不是足够合理请更多人一起讨论下
from er.
在 2c6f7c1 中添加了该功能,后续再开放一段时间供大家讨论实现是否满足需求
具体可结合 #27 进行讨论
from er.
对于URL这事,现在的ER框架中,在Action里this.model.get('url')是可以取到当前关联的URL的,而且这个URL不一定和地址栏上的一样,是真正 进入到这个Action 时的URL,因此 isModify 这样的判断可以不用location.hash了
我觉得url信息应该直接扔在Action实例里,放model里貌似有点不搭调
from er.
er.locator.redirect
其实我一直不建议在Action里使用这个接口的。唯一麻烦的就是a了。是否需要接管a,preventDefault掉?在container上接管是否可行。
还有上次讲到的,要不要自动给container绑定click,提供command
from er.
分2方面说这个问题:
首先,ER 3.0的设计是,普通的对象(只要有enter
方法)都能成为Action。这个设计的目的是为了让ER可以用于非常简单的页面构建(非单页大型应用),但带来的一个问题就是,有可能使用者会用一个单例的对象当Action用。那么如果往这个单例的对象上丢东西,会导致对象的状态被外部修改,与其它的逻辑冲突等,因此仅会在调用enter
的时候传递,而enter
方法的参数设定为只有一个model
,这也是为了保持接口的简单,所以url天生被放在model中。
另一方面来说,Action是一些逻辑的集合,应该是非常纯粹的普通对象。从这个角度理解,我不认为URL这一类与Web有明显关联的东西是Action的一部分
from er.
其实我一直不建议在Action里使用这个接口的。
如果没有这个接口,在代码中进行跳转,会用require('er/locator').redirect(url)
,那么怎么使locator的redirect可以形成正确的行为,不去修改地址栏,是个很复杂的设计。 @errorrik 有什么想法吗?
是否需要接管a,preventDefault掉
现在的实现就是这样的,会接管掉所有href
以 # 起头的<a>
元素并取消默认行为,转到controller上。
自动给container绑定click,提供command
这个command作何理解?我的设想中renderChildAction就应该是自治透明的,不应该再让业务开发者 因为是子Action所以要做些额外的工作 ,也保证一个Action可以同时作为主Action和子Action复用。
from er.
ER最初的设计里是有一个Request
对象的,里面会包含url
、referrer
、redirect
等一堆东西,但由于加入这个东西导致ER在整个模型上会复杂一些(比如写个Action还要一会儿model一会儿request),所以去掉了,导致现在一部分在model里,一部分在Action自己身上,要加回去倒也不难……
from er.
如果没有这个接口,在代码中进行跳转,会用require('er/locator').redirect(url),那么怎么使locator的redirect可以形成正确的行为,不去修改地址栏,是个很复杂的设计。 @errorrik 有什么想法吗?
我没表达清楚。是不建议使用locator的redirect,因为用的会很脏到最后。当然,用action上的redirect就没问题
这个command作何理解?我的设想中renderChildAction就应该是自治透明的,不应该再让业务开发者 因为是子Action所以要做些额外的工作 ,也保证一个Action可以同时作为主Action和子Action复用。
这个话题有点跳跃,和当前issue讲的renderChildAction
无关。
就是view提供一个事件叫做command,当点击元素带有data-command时,fire这个事件。最常见的外围dom点击事件代理。我们上次讨论这个话题是因为table内部有些单元格内的元素,点击还要有行为,拼接html比较脏
from er.
另一方面来说,Action是一些逻辑的集合,应该是非常纯粹的普通对象。从这个角度理解,我不认为URL这一类与Web有明显关联的东西是Action的一部分
确实,Action本身是不需要管这些东西的。但是,Action也是有环境的。这个有点类似我们之前说的viewContext了。
from er.
我们上次讨论这个话题是因为table内部有些单元格内的元素,点击还要有行为,拼接html比较脏
记起来了……DAN的Table已经被我这么搞了,不过以前的ER没有这么强封装性的View,所以command丢在Action上了。
View提供command
事件是比较好的,但做通用比较难。难点在于,事件触发的时候,应该传怎么样的参数。反正不能直接把DOM元素丢出去……
如果是业务对应的View自身实现command
事件,那么可以有逻辑去取一些东西,比如取一个data-id
的值算id,或者向上找到<tr>
取上面的id再substring处理之类的……但是在基类中做通用的话,这个command事件就只能传一个事件名了……除非设计一套语法来支持传参,比如data-command="remove(id=${id})"
,然后View来解析……
from er.
或者,直接取data-的,拼成Object,丢出去。。。
from er.
确实,Action本身是不需要管这些东西的。但是,Action也是有环境的。这个有点类似我们之前说的viewContext了。
所以以前确实是有个叫Context,你也知道这版本的ER的设计很多是借鉴我在11年初的某个博客来的,当时有个Request
对象,还有Session
和Application
这几级的数据管理。后来觉得ER核心应该精简些,Session
管理和Application
级静态数据并不是每个系统(不仅仅考虑ECOM内部的业务端)都会有的,所以去掉了。
去掉了以后一看,URL中的query参数本身就会进Model这个是没意见的,那么真的只剩下一个URL了,于是这东西就被我去掉了。
我现在想了一个解决方案:
考虑到单例对象当Action的问题,controller层面不变动,依旧在调用
enter
时把URL作为context
一部分传递。Action基类里处理context
的时候,把url拿出来作为自己的属性。
这样影响面仅在使用ER的Action基类时出现,其它不变,另外model中依旧还有url
存在,用不用无所谓,不特地去掉了。
from er.
嗯,没有contxt这个东西存在也没什么,我唯一比较质疑的是url直接放在model中。因为,如果query参数本身可能有url项。
from er.
或者,直接取data-的,拼成Object,丢出去。。。
那么我们按ESUI的方式设计一套,弄成data-command-xxx="yyy"
会变成xxx属性值为yyy,这样如何?data-*
用得太频繁了,甚至一些jQuery插件之类的都要用到,不适合直接用。
只不过依旧感觉有点奇怪,ER最多的使用方式是和ESUI结合,那么ESUI会屏蔽掉DOM,ER的View不应该访问DOM,形成一个Actio->View->Control->DOM的隔离层,这里的command就没用了,必须由Control来提供。甚至产生一个副作用是Control完成command功能后,得preventDefault()
掉,不然ER的VIew又会收到command,形成错乱。
from er.
只不过依旧感觉有点奇怪,ER最多的使用方式是和ESUI结合,那么ESUI会屏蔽掉DOM,ER的View不应该访问DOM,形成一个Actio->View->Control->DOM的隔离层,这里的command就没用了,必须由Control来提供。甚至产生一个副作用是Control完成command功能后,得preventDefault()掉,不然ER的VIew又会收到command,形成错乱。
要不,就不默认提供了,在ESUI的Panel提供也行。我就是突然想到这事情,就抛出来,免得忘记了
from er.
你的blog,现在改win8风了。。。
from er.
Blog因为有一次服务器丢失,数据全毁,完全重新做过了,后台都是自己写的……
要不,就不默认提供了,在ESUI的Panel提供也行。我就是突然想到这事情,就抛出来,免得忘记了
我觉得Control可以直接提供command功能了,至少Panel
、Label
、Table
、Tip
这些全是会用上这功能的
我最初的想法是command纯粹应该是ESUI的一个Extension,Control都不用管这事,扩展挂上就有,不挂没有,需要的就全局挂一个
from er.
我觉得Control可以直接提供command功能了,至少Panel、Label、Table、Tip这些全是会用上这功能的
上次讨论貌似因为不是全部控件都有视图,不是所有控件都会用到,所以把click给干掉了来着
from er.
所以,就extension吧。其实这事,有感觉的人怎么都能解决,否则你告诉人有extension,人也不会用这货来解决的。如果你觉得需要,就在esui里默认提供一个extension好了~
from er.
话说,重新写后台这种事情,现在真心没力气干了,老了。。。电脑没电了,回头再来看讨论
from er.
已在 c733929 中将bindFn
修改为bind
from er.
嗯,没有contxt这个东西存在也没什么,我唯一比较质疑的是url直接放在model中。因为,如果query参数本身可能有url项。
我回顾了一下现在的实现,如果query中有url
这个参数的话, 会覆盖 掉model中的url。
不过默认的Action基类,会把enter
时传入的参数保存起来,所以可以在Action中用this.context.url
取得真正的url,其它包括this.context.isChildAction
也可以取到(虽然model中也有),是不是还有必要把url放到Action下方便用this.url
取呢?
from er.
renderChildAction 里 配合 hijack 后会出现这样的情况:
点childAction的a标签刷新childAction时,containerhijack没有消失,造成hijack 事件在container上多次绑定。
另外,这个refresh的概念还是考虑下吧。
这个场景,childAction的view里有搜索按钮和搜索框,点按钮后,当前childAction得刷新下,但是当前视图的有些值,比如container,isChildAction等非model里的数据还是要的,而model里初始数据则由类似enter(context)的context传递过去。
from er.
我原先的想法是在重定向的时候,Action本身会放leave
事件,enterChildAction
在leave
事件里有注册函数取消掉hijack功能。当时确实思考过如果Action是用户自己写的对象没有这事件怎么办,我再去仔细看看吧。
refresh这事容我再细想一下,因为从框架层面上,其实真的不太知道哪些东西要refresh,可能有点麻烦,我会近期下个结论,其他人也可以讨论下
from er.
在 248fa97 中增加了一些代码,保证去除hijack
事件处理函数的覆盖面更全。
关于refresh这个问题,还是没想得太明白,能从逻辑上来讲一下你对这个接口的要求吗,比如这样:
Action需要一个
refresh
接口,这个接口与现有的enter
的区别是balabalabala,在其中会做的操作有balabalabala……
from er.
Action refersh接口需求:
第一次进入使用enter,事A是给container绑定或委托一些事件以及Action自身绑定一些事件,特别是如$(container).on('click','.subClass',function(){})这样类型的,事B是给container里面的事情绑定事件或做一些Model的转义等等操作。此时Action需要自己刷新一下,包括Model的重新获取以及View的重新渲染,那A事件就不运行了,B要运行的。如果没有refresh的话,我只能这么弄了,controller.renderChildAction('actionpath',action.view.container, args)。。。 自己调用renderChildAction刷新自己,感觉很怪,自己变成自己崽子了。
from er.
事A给container
绑定事件是在View
中做的,Action
中不会有直接绑定DOM事件的代码。那么在refresh的过程中,View
是销毁后重新创建并render()
,还是保留原来的View实例只是再次调用render()
?根据这个选择的不同,会产生 不同的实现:
- 如果View销毁重建,再调用
render()
,即完整走createView() -> render()
这过程,那么不存在 事A不用做 的问题,因为View销毁的时候会把container上的事件都注销,重建并渲染的时候再绑回去,这个流程和正常的enter()
完全一致。 - 如果保留View的实例,那么流程是
model.load() -> view.render()
,跳过createModel()
和createView()
这两个过程,则要在View上添加一个repaint
之类的方法,Action再添加refresh
之类的方法。不过因为这个refresh
事实上就是重做model加载和view渲染,感觉是一个更贴近具体业务的东西,是否合适做统一的提供依旧持怀疑态度。
给Action自身绑事件这个事我依旧想强调,不应该出现 给自己绑事件 这样的行为,这不是事件的正确用法。
ER所推荐的做法是,当有参数改变时,这些参数要表现在URL中,这是ER对 可访问性 的追求,也是ER的最初、最核心的理念,另外ER的理念还有 模板保持无JS依旧基本可用 等。如果参数不在URL中,就不能通过复制URL分享当前的页面,会违背ER的理念。
如果当参数变化时,参数会在URL中,那么代码应该是this.redirect('newactionpath')
即可,不需要调用controller.renderChildAction
from er.
到现在为止看起来这功能圆满了,先关掉,有事再开~
from er.
Related Issues (20)
- 子Action中a标签外跳到一个er path的需求 HOT 7
- [template]etpl2/3从Model中取值问题 HOT 2
- deferred中加入一个方法控制串行请求合适么? HOT 9
- controller#forward,mix options给actionContext会出问题 HOT 2
- 两层以上的ChildAction里发生global redirect的时候会报错 HOT 6
- 页面切换次数多了的时候,会出现hash跳转了但是view没渲染的情况 HOT 24
- 开放路径访问权限方法 HOT 1
- enteractionfail事件增加参数
- ER 不在npmjs.org 里? HOT 4
- ER的两点疑问 HOT 11
- er/controller forwardaction 并不能阻止后续load行为 HOT 1
- 老ER里refresh 为啥只刷新控件,而不重载render整个 tpl HOT 1
- locator中updateURL函数为啥还要比较一次getLocation() !== url HOT 1
- er在ie6,7,8里哪些功能不能用? HOT 2
- 有什么地方可以设置所有的action在complete的时候执行同一个方法么? HOT 2
- [email protected] 与 [email protected] 兼容问题 HOT 3
- Model 中复制 datasource 有 bug
- er的默认路径可以默认不显示吗?
- events.js中有几个event的说明重复有误
- 貌似这里promise resolver里this指向全局,并没有绑定当前context是promise
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from er.