[Tapestry4] 关于给自定义组件赋初时值的问题

yongganzhe 2007-02-11
我创建了一个组件Score,其中该组件的带两个参数的math和english,我要把这两个参数的值赋给Score组件相应的属性ComMath和ComEnglish,只要在Score组件中写上如下代码即可:
protected void renderComponent(IMarkupWriter writer,IRequestCycle cycle)
{
  if(!cycle.isRewinding())
  {
  setComMath(getMath());
  setComEnglish(getEnglish());
  }
  super.renderComponent(writer, cycle);
  if(cycle.isRewinding())
  {
 
  setMath(getComMath());
  setEnglish(getComEnglish());
 
  }
以上代码运行成功。
现在我想直接对ComMath和ComEnglish赋值为80和90,对上述代码修改为:
protected void renderComponent(IMarkupWriter writer,IRequestCycle cycle)
{
  if(!cycle.isRewinding())
  {
  setComMath(80);
  setComEnglish(90);
  }
  super.renderComponent(writer, cycle);
  if(cycle.isRewinding())
  {
 
  setMath(getComMath());
  setEnglish(getComEnglish());
 
  }
页面第一次执行时,ComMath和ComEnglish对应的TextField的内容显示为80和90,不论我对ComMath和ComEnglish对应的TextField赋什么值,提交后界面上两个TextField的内容始终都是80和90。如下代码中在页面提交时并不执行
if(!cycle.isRewinding())
  {
  setComMath(80);
  setComEnglish(90);
  }
然后调用
super.renderComponent(writer, cycle);
这时我对两个TextField写的值被赋值给相应的ComMath和ComEnglish了。并且调用如下方法将值传递给参数Math和English了,这时候在界面上应该显示的是我新赋值的数字,但为什么TextField的内容始终都是80和90呢?望高手解答!
if(cycle.isRewinding())
  {

  setMath(getComMath());
  setEnglish(getComEnglish());
 
  }
tapestry 2007-02-11
建议看一下我的博客
深入理解Tapestry的Rewind   http://tapestry.iteye.com/admin/show/41724

组件的生命周期跟Page是一样的
* initialize():页面初始化
* pageBeginRender() ("rewind"):getRequestCycle().isRewinding()为true
* rewind of the form / setting of properties:所有表单组件调用rewindFormComponent来取值赋值
* Deferred listeners (for Submit components):调用Submit组件的listener
* Form's listener:调用Form组件的listener
* pageEndRender() ("rewind"): getRequestCycle().isRewinding()为true
* pageBeginRender() (normal): getRequestCycle().isRewinding()为false
* pageEndRender() (normal): getRequestCycle().isRewinding()为false
他显示的时候还是会调用
if(cycle.isRewinding())
{

setMath(getComMath());
setEnglish(getComEnglish());

}
这个的,而且是最后一步调用
yongganzhe 2007-02-11
谢谢Tapestry的答复,我看了你的博客文章,写的很好。我认为在页面rewind完成后,还要显示页面,也就是说一个页面提交过程可以分为两步:第一步是rewind.第二步是显示页面。所以最后一步执行的应是:
if(!cycle.isRewinding())
{
setComMath(80);
setComEnglish(90);
}
这段代码所以就造成了ComMath和ComEnglish的值始终都是:80和90。也就是完整的rewind的过程是否应该多写这么一步
* render Of the form:显现页面组件的内容
修改后的为:
* initialize():页面初始化
* pageBeginRender() ("rewind"):getRequestCycle().isRewinding()为true
* rewind of the form / setting of properties:所有表单组件调用rewindFormComponent来取值赋值
* Deferred listeners (for Submit components):调用Submit组件的listener
* Form's listener:调用Form组件的listener
* pageEndRender() ("rewind"): getRequestCycle().isRewinding()为true
* pageBeginRender() (normal): getRequestCycle().isRewinding()为false
* render Of the form:显现页面组件的内容
* pageEndRender() (normal): getRequestCycle().isRewinding()为false

我理解的对吗?
tapestry 2007-02-11
生命周期函数是指用户提交请求到用户看到页面之间框架调用的Page类方法。如果你说的ender Of the form:显现页面组件的内容是指用户看到了页面组件的内容,那应该放到最后,那时"pageEndRender() (normal): getRequestCycle().isRewinding()为false"都执行完了,声明周期执行时reponse是缓存的,最后执行完毕后flush到用户浏览器的,那时用户才看到最终内容。
yongganzhe 2007-02-12
谢谢Tapestry大哥的答复
Global site tag (gtag.js) - Google Analytics