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

render 及 destory 方法是否应该支持多次调用? #50

Open
lianqin7 opened this issue May 30, 2013 · 9 comments
Open

render 及 destory 方法是否应该支持多次调用? #50

lianqin7 opened this issue May 30, 2013 · 9 comments
Labels
Milestone

Comments

@lianqin7
Copy link
Member

RT,个人觉得 renderdestory 均为 widget 生命周期的特殊方法,不应该支持多次调用

所以 用 before/after 来限制调用更加适合,也不怕 方法被 override

this.before('render', function(){
    if(this.rendered) return false;
}).after('render', function(){
    this.rendered = true;
});

this.before('destory', function(){
    if(!this.rendered || this.destoryed) return false;
}).after('destory', function(){
    this.destoryed = true;
});

// 这样的话override方法就不要考虑 rendered 的状态了
render: function(){
     // dosomething

    Xxx.superclass.render.call(this);

    return this;
}
@popomore
Copy link
Member

popomore commented Jun 4, 2013

我本来也想这么实现的,但过程中有点问题

aspect 会封装一下原方法,生成的新方法在 this 上,但是调用 destroy 时候会把 this 上面的都删除 (base 的处理)。也就意味着第二次调用 destroy 的时候,aspect 已经没有了。

第一次调 destroy

this
 - destroy  <- 调用这个,aspect 生成的
 - __proto__
   - destroy

第二次调 destroy

this  <- aspect 生成的 destroy 被删除
 - __proto__
   - destroy <- 调用的这个

@lianqin7
Copy link
Member Author

lianqin7 commented Jun 4, 2013

考虑下在destroy方法里 delete this上的属性(或者只针对 __events属性)的时候做个延时处理?

除了这种情况外,after('destory', fn)的在业务中也是有些使用场景的

@popomore
Copy link
Member

popomore commented Jun 4, 2013

想到两种极端的做法

  • 不删 destroy,destroy 于主同在
  • 只删除 this 上不太彻底,应该连原型链的都删除,调用的时候就报错(现在开发者定义的方法就会报错)

@popomore
Copy link
Member

popomore commented Jun 4, 2013

又想了个办法,在第一次调用 destroy 后,生成一个空的 destroy,这样不会报错也不会多执行。

popomore added a commit to aralejs/base that referenced this issue Jun 4, 2013
@popomore
Copy link
Member

popomore commented Jun 4, 2013

用 aspect 还是有问题,destroy 执行的时候是会把所有事件清除的,第二次就没用了。

看来上面的这种方式最简单

@lifesinger
Copy link
Member

在第一次调用 destroy 后,生成一个空的 destroy

这个不错,简单直接呀

@lifesinger lifesinger reopened this Jun 4, 2013
@lianqin7
Copy link
Member Author

lianqin7 commented Jun 4, 2013

@popomore 在这个方法里加上 this.destoryed = true 吧,某些时候可能还是要判断下 xxx.destoryed


另一个讨论,属于 render 和 destroy 的生命周期的

  • destory后调用render就没意义了吧,是否destroy时对render做个处理?
  • render是否可以用 aspect 的方式做个多次调用保护?比每次都去判断 this.rendered 更靠谱

@popomore
Copy link
Member

popomore commented Jun 4, 2013

有 render 调用多次的场景么,很多场景是误用,应该尽量避免的。

@popomore popomore mentioned this issue Jun 4, 2013
15 tasks
@lianqin7
Copy link
Member Author

今天又有同学问我render多次调用的问题(在widget的派生类里没有做保护,又误调用了多次render)

同样的2个生命周期的方法,render和destory,却 没有相同的处理逻辑_

@lizzie 看看是否要解决?只是一个提议, 每次 override render的时候都得小心翼翼的,不如 destory 那么爽

@lianqin7 lianqin7 reopened this Oct 30, 2013
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants