我有表格和网格。用户必须在表单字段中输入数据,然后在网格中显示相关记录。我想实现一个搜索表单,例如:用户将键入学生的姓名和性别,然后将获得所有学生的名称和性别相同的网格。
因此,我使用ajax将表单字段值发送给PHP,然后创建一个将在网格存储中使用的json_encode。
我真的不确定我的想法是否合适。但我还没有找到另一种方法。
问题是当我在商店中将autoLoad设置为true时,网格会自动填充所有数据 - 而不仅仅是用户要求的内容 -
所以,我知道我必须将autoLoad设置为false,但是结果没有显示在网格中,即使它在firebug中成功返回!
我不知道该怎么做。
我的观点
{
xtype: 'panel',
layout: "fit",
id: 'searchResult',
flex: 7,
title: '<div style="text-align:center;"/>SearchResultGrid</div>',
items: [{
xtype: 'gridpanel',
store: 'advSearchStore',
id: 'AdvSearch-grid',
columns: [{
xtype: 'gridcolumn',
dataIndex: 'name',
align: 'right',
text: 'name'
},
{
xtype: 'gridcolumn',
dataIndex: 'gender',
align: 'right',
text: 'gender'
}
],
viewConfig: {
id: 'Arr',
emptyText: 'noResult'
},
requires: ['MyApp.PrintSave_toolbar'],
dockedItems: [{
xtype: 'PrintSave_tb',
dock: 'bottom',
}]
}]
},
我的商店和模特
Ext.define('AdvSearchPost', {
extend: 'Ext.data.Model',
proxy: {
type: 'ajax',
url: 'AdvSearch.php',
reader: {
type: 'json',
root: 'Arr',
totalProperty: 'totalCount'
}
},
fields: [{
name: 'name'
}, {
name: 'type_and_cargo'
}]
});
Ext.create('Ext.data.Store', {
pageSize: 10,
autoLoad: false,
model: 'AdvSearchPost',
storeId: 'AdvSearchPost'
});
我的控制器
xmlhttp.open("GET", "AdvSearch.php?search_name=" + search_name, true);
xmlhttp.send(null);
我的PHP脚本
if (!$con) {
throw new Exception("Error in connection to DB");
}
$query = "SELECT name, gender FROM students WHERE name ILIKE '%$search_name%' ";
$result = pg_query($query);
while ($row = pg_fetch_array($result)) {
$Arr[] = array('name' => $row[0], 'gender' => $row[1]);
}
$searchResult_list = array();
$searchResult_list['success'] = true;
$searchResult_list['Arr'] = $Arr;
$searchResult_list['totalCount'] = count($searchResult_list['Arr']);
echo json_encode($searchResult_list);
if (!$result)
die("Error in query: ".pg_last_error());
pg_close($con);
答案 0 :(得分:1)
我不太确定我是否可以关注你...你如何过滤?它本地出现在分页商店吗?
我建议您在商店中使用remoteFilter: true
。您现在可以在服务器端强制执行至少一个过滤器参数,否则返回一个空的结果集。
请注意,提交给服务器的过滤器属性如下所示:
Filters:[{property:"FieldName", value: "anyValue"}] // objectview
答案 1 :(得分:-2)
好吧......我想我可以提供帮助,但它需要的思路与你现在所做的略有不同。
当您创建商店时,您为其提供了可用于进行AJAX调用的代理。它没有使它跟踪对定义的URL的ajax调用。因此,当您定义商店并为其指定ID时,它会在store manager内注册该商店的实例。然后,您应该使用该商店的代理在控制器中加载数据:
//Get a reference to the store that the view references
var store = Ext.data.StoreManager.lookup('advSearchStore');
//Load data into the store using it's configured proxy
store.load({
params: {
search_name: search_name
}
});
假设一切都在代理中正确设置(看起来不错)并且服务器正确获取并响应请求,您设置的代理应解码您的Web服务返回的JSON数据,将其解码为javascript对象,获取Arr属性,并将每个项目转换为已定义模型的实例。然后它会自动将这些添加到网格中,您应该有预期的结果。