Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Aspect的功能强化 #5

Closed
lianqin7 opened this issue Oct 11, 2012 · 14 comments
Closed

Aspect的功能强化 #5

lianqin7 opened this issue Oct 11, 2012 · 14 comments
Milestone

Comments

@lianqin7
Copy link
Member

@lifesinger

before方法目前还是 "只读" 的,无法阻止method本身的执行,有没有计划去升级Aspect的功能?

利用before方法来阻止method的执行的应用场景还是比较多的,目前只能人肉的去trigger('before:method')来达到目的,但是这种做法对于method的override来说就是灾难:(

@lifesinger
Copy link
Member

@lianqin7 这个内部有讨论过,当时是本着保持简单的原则,没有增加更多 Aspect 的功能

这个主要还取决于 events 的机制,目前和 Backbone 等类库的原则是一致的,简单一致,如果发现不能满足,往往可以通过调整应用层的代码结构、逻辑来实现

目前 before 方法中,阻止 method 执行的需求,看起来很普遍,会仔细考虑下,如果确实需要就增加。

其他 Aspect 的功能暂时不增加。

@lifesinger
Copy link
Member

events 事件的阻止功能还是得仔细考虑下,需求挺旺盛的。

@popomore
Copy link
Member

popomore commented Apr 2, 2013

考虑加上这个功能

callback return false 的时候阻止方法执行。

@popomore
Copy link
Member

从实现的角度说明下

before('xxx') 注册了 before:xxx 的事件,同一个事件可以注册多个 callback,在 trigger 时按照注册的先后顺序执行。

a
  .before('show', callback1)
  .before('show', callback2)
  .before('show', callback3)

a.show()

show 方法调用时会依次调用 callback1 callback2 callback3 show。这里问题就来了

  1. 应该链式阻止,如 callback1 阻止 callback2callback2 阻止 callback3
  2. 还是只要一个 callback 就阻止
  3. 或需要所有的 callback 阻止

还有 events 的 trigger 方法是返回实例的,所以不能取得 callback 的值,那就需要要异步的方式去实现。

a.before('show', function(stop) {
  stop();
})

只要调用了 stop 就会阻止。

@lianqin7 @lifesinger 有什么看法

@lifesinger
Copy link
Member

应该是按顺序阻止吧?就是不再往后执行。

a.before('show', function(stop) {
  stop();
})

这个有点不妥,目前的设计里,callback 的参数是 trigger 时传入的,不一定是 stop 方法。这一块的 API 设计有点头疼。

参考 DOM 的话,preventDefault / stopImmediately 等,则有点把事情搞复杂。

感觉还是设计成 return false 就阻止往后继续执行比较好。取 callback 的值,可以想想改动 events 的内部实现。

@popomore
Copy link
Member

这样的话 events 的改动稍大,研究下。

@lianqin7
Copy link
Member Author

@popomore

YUI3的设计是:

  1. 非链式阻止,before的事件都会触发
  2. 但是只要有一个 callback return false 就阻止 method 的执行

个人比较推荐YUI的处理方式,因为:

  1. 对 before 的注册的 callbacks 之间本来就是互相独立的存在,不应该由于某个的阻止逻辑就影响了其他的 callbacks
  2. 还是基于互相独立的原则,对 method 的阻止只要是一个决定了,就应该阻止

@lianqin7
Copy link
Member Author

@popomore

这个对 events 的改动主要还是在 this.trigger 的返回值上,可能对现有组件有影响:(

@popomore
Copy link
Member

确实会有影响,如果不改这里,api 的设计上会很头疼,要拿 callback 的返回值很麻烦

@lianqin7
Copy link
Member Author

this.trigger().xxx().yyy() 这种用法相对的还是较少的吧,可以全局搜索改下
其他的api设计都太不够人性化了:(

@popomore
Copy link
Member

总结下

  1. this.trigger() 的返回值是 callback 的返回值,其他的 api 设计都太蛋疼了,而且 trigger 之后的链式操作都较少。
  2. 只要有一个 callback 返回 false 就会阻止方法执行。纠结点是是否会影响之后的 callback 执行,也就是是否链式阻止。

@popomore
Copy link
Member

想了下,感觉链式的阻止不太好。

注册事件的人可能不是同一个人,如果自己注册的 callback 因上一个阻止而没执行,这个有背于直觉。

所以采用只要有一个阻止就不执行的方式。

@lifesinger
Copy link
Member

好,这样不错。

popomore added a commit that referenced this issue Apr 22, 2013
popomore added a commit that referenced this issue Apr 22, 2013
@popomore
Copy link
Member

before 阻止方法执行的同时也会阻止 after 的执行。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants