是否可以仅重新加载一行ATK4 Grid?
例如,在Form中进行更改后,大部分时间都在CRUD中,您只需要重新加载一个网格行而不是所有Grid对象。
修改
我很抱歉没有明确表示我对ATK4(敏捷工具包)框架专门针对此功能感兴趣。我在这个问题上添加了atk4标签,但在主题和问题正文中没有提到“ATK4”。对不起。
我或多或少知道如何用jQuery以标准方式做到这一点,但我感兴趣的是,在ATK4框架中如何更容易地做到这一点。比如$ grid-> row(ID) - > reload()或类似的东西。
答案 0 :(得分:1)
Agile Toolkit不为此提供开箱即用的功能。它曾经是ui.atk4_grid.js的一部分,仍然可以找到它会向Grid视图发送一个自定义请求,但是这些表并不总能很好地用于此,然后有时您还需要重新加载多行
您拥有为此构建附加组件的所有工具。您需要调用grid :: formatRow()一次并返回HTML,然后使用JS将其插入到网格中。
以下是旧的(删除)方法:
function getRowContent($id,$datatype='jquery'){
// if DB source set
if(isset($this->dq)){
// *** Getting required record from DB ***
$idfield=$this->dq->args['fields'][0];
if($idfield=='*'||strpos($idfield,',')!==false)$idfield='id';
$this->dq->where($idfield,$id);
//we should switch off the limit or we won't get any value
$this->dq->limit(1);
#zak: This fix is if grid is not using the $this->api->db database but some else it hsould be depending only on $this->>
$row_data=$this->dq->do_getHash(); //$this->api->db->getHash($this->dq->select());
}
// if static source set
elseif(isset($this->data)){
$found=false;
foreach($this->data as $index=>$row){
if($row['id']==$id){
$row_data=$row;
$found=true;
break;
}
}
// no data found, returning empty string
if(!$found)return "";
}
else return "";
// *** Initializing template ***
$this->precacheTemplate(false);
// *** Rendering row ***
$this->current_row=$row_data;
$this->formatRow();
// *** Combining result string ***
$func='formatRowContent_'.$datatype;
return $this->$func($id);
}
protected function formatRowContent_html($id){
$this->row_t->set($this->current_row);
return $this->rowRender($this->current_row);
}
protected function formatRowContent_ajax($id){
$result="";
foreach($this->columns as $name=>$column){
$result.=$this->current_row[$name]."<t>".$this->current_row[$name.'_original'].
// appending styles as structured string
"<t>".$this->getFieldStyle($name,$id).
"<row_end>";
}
return $result;
}
protected function formatRowContent_jquery($id){
$result=array();
$i=1;
foreach($this->columns as $name=>$column){
$result[$i]['data']=array('actual'=>$this->current_row[$name],
'original'=>$this->current_row[$name.'_original']);
$result[$i]['params']=$this->tdparam[$this->getCurrentIndex()][$name];
$i++;
}
$result=json_encode($result);
return $result;
}
希望这会对你有帮助。
答案 1 :(得分:1)
在atk4中使用js() - &gt; univ() - &gt; reloadRow($ id),它处理jquery客户端部分以刷新一行。现在,当此reload_row请求到达时,网格(服务器部分)还需要输出一行而不是整个网格。这可以通过以下网格扩展(基于网格/内联的运行方式)来完成:
Class TestGrid extends Grid {
function init() {
parent::init();
if($row_id=$_GET[$this->name.'_reload_row']){
$g=$this;
$this->api->addHook('pre-render',function() use($g,$row_id){
$g->precacheTemplate();
foreach($g->getIterator() as $g->current_id=>$g->current_row){
if($row_id == $g->current_id) {
$g->formatRow();
$result=$g->rowRender($g->row_t);
if($g->api->jquery)$g->api->jquery->getJS($g);
break;
}
}
throw new \Exception_StopRender($result);
});
}
}
}
为了在页面上使用CRUD进行测试(它也应该仅适用于Grid):
$g=$this->add('CRUD', array('grid_class' => 'TestGrid'));
$g->setModel('User');
if($g->grid) {
$g->grid->addColumn('button', 'rerow');
if($row_id = $_GET['rerow']){
$g->grid->js()->univ()->reloadRow($row_id)->execute();
}
}
这会产生带有额外按钮'Rerow'的CRUD,点击时会重新加载特定行。
答案 2 :(得分:0)
在谈到CRUD时,您可能有一些包含数据行的概述。
我点击具体行上的Edit
后你可能会打开一个包含表单的弹出窗口,允许用户更改该行的数据。正如您要求刷新一个具体的行,我也猜测您正在使用AJAX调用发送和存储数据。
好吧,在这里你可以利用AJAX的onSuccess
部分(当使用jQuery $.ajax
时)。您必须存储行ID才能在提交数据后正确地对其进行寻址。成功执行AJAX调用后,将调用onSuccess
句柄,您应该使用先前存储的行ID实现将对该行进行寻址的代码,并使用当前已提交和存储的数据重置单元格中的数据