在ATK4中停止网格的重新加载计时器

时间:2014-04-08 20:29:45

标签: atk4 agiletoolkit

我正在测试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)函数?

1 个答案:

答案 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对象。