我正在测试ATK4的某些情况,如果我可以继续使用它。其中一个场景是组和成员的状态页面,它应该自动重新加载网格,其中包含动态组和成员信息。
网格重新加载我已实现,如此线程Agile toolkit : how to automatically reload grid
中所述以下是会员页面的代码:
<?php
class page_members extends Page {
function init(){
parent::init();
$page = $this;
$page->api->stickyGET('group_id');
$grid = $page->add('Grid');
$model = $grid->setModel('Member');
if ($_GET['group_id'])
$model->addCondition('group_id', $_GET['group_id']);
$page->js(true)->univ()->setInterval(
$grid->js()->reload()->_enclose()
,10000);
}
}
如果我使用 group_id 参数从浏览器中调用它,它会像预期的那样工作。但是此页面将从组页面调用到具有以下代码的frameURL:
<?php
class page_groups extends Page {
function init(){
parent::init();
$page = $this;
$grid = $page->add('Grid');
$model = $grid->setModel('Group');
$grid->addColumn('button','members');
if($_GET['members']){
$grid->js()->univ()
->frameURL('Members' ,$page->api->url('../members',array('group_id'=>$_GET['members'])))
->execute();
}
$page->js(true)->univ()->setInterval(
$grid->js()->reload()->_enclose()
,10000);
}
}
如果我点击组1中的“成员”按钮,组1的成员页面将在框架中打开并每10秒刷新一次。没关系。但是,如果我通过单击第2组中的“成员”按钮关闭框架并打开一个新框架,则网格会在刷新网格时循环通过第1组和第2组。
我认为,问题是由setInterval()
函数创建的计时器,必须在帧关闭之前由clearInterval(id)
清除。 setInterval()
函数有一个返回值,但我不知道,我如何处理它到ATK4框架中的clearInterval(id)
函数?
答案 0 :(得分:0)
存在问题,因为setInterval
已添加到全局window
对象,并且因为window
对象本身未重新加载(使用AJAX我们只重新加载DOM树的部分)setInterval
方法即使关闭模态对话框或重新加载&#34;页面&#34;也会继续调用容器
简而言之,这里写着:http://www.w3schools.com/jsref/met_win_setinterval.asp
setInterval()方法将继续调用该函数,直到调用clearInterval()或窗口关闭。
因此,在这种情况下可能的解决方法之一将是:
setTimeout
代替setInterval
并每次重新加载小部件setTimeout
clearInterval
以删除旧的全局注册间隔有关setInterval的大量有用信息,请访问:https://developer.mozilla.org/en/docs/Web/API/window.setInterval
class page_company extends Page
{
function init()
{
parent::init();
$page = $this;
$grid = $page->add('Grid');
$model = $grid->setModel('Company');
$grid->addColumn('button','company');
if ($_GET['company']) {
$grid->js()->univ()
->frameURL('Employees', $page->api->url('../employee', array(
'company_id'=>$_GET['company'])))
->execute();
}
}
}
class page_employee extends Page
{
function init()
{
parent::init();
$page = $this;
$page->api->stickyGET('company_id');
$grid = $page->add('Grid');
$model = $grid->setModel('Employee');
if ($id = $_GET['company_id']) {
$model->addCondition('company_id', $id);
}
// NOTE:Important is that you add setTimeout JS chain to grid not page!
// That's because you reload only grid and you need to receive
// this JS chain from server on each reload to keep it reloading.
// $page is not reloading, only $grid is!
$grid->js(true)->univ()->setTimeout(
$grid->js()->reload()->_enclose()
,5000);
}
}
这样,当你关闭一个模态对话框并在少于5秒(setTimeout时间)内打开新对话框时,一切正常除了情况。问题是相同的 - setTimeout
也被添加到全局window
对象中,因此即使您在平均时间内关闭模态对话框,它仍会在这5秒后执行。
在Github中使用最新的ATK提交,您现在可以使用一个简单的链初始化任何View的定期重新加载。
所以不是这样的(不适用):
$grid->js(true)->univ()->setTimeout(
$grid->js()->reload()->_enclose()
,5000);
现在您只需致电:
// reload grid every 5 seconds
$grid->js(true)->reload(null,null,null,5000);
注意:您应该将此应用于您要定期重新加载的View对象。