我正在尝试使用ExtJS构建搜索应用程序。我创建了虚拟表单来搜索个人详细信息。我有一个PHP脚本连接到mysql DB。我能够将表单参数传递给php,并能够在msg框中获取返回结果。但我不明白如何传递它来存储并在MVC中显示相同的网格。我试图将php的返回数据传递给store,然后在控制器中调用Grid(List.js)。仍然没有奏效。我已经显示了我用来执行此操作的所有代码。另外我怀疑的是,在商店和onSearchButtonClick
中使用代码的代理部分(即url:app / scripts / Info.php)是必不可少的。控制器中的功能?因为我可以直接将返回值传递给onSearchButtonClick
函数存储,我希望在两个地方连接php脚本都不是必需的。但是,专家们澄清这一点真是太好了。
以下是我的商店:
Ext.define('App.store.Info', {
extend: 'Ext.data.Store',
model: 'App.model.Info',
alias: 'widget.infostore',
pageSize : 50,
autoLoad : false,
remoteFilter: true,
proxy :{
type : 'ajax',
url : 'app/scripts/Info.php',
reader : {
type : 'json',
root : 'result',
successProperty : 'success'
}
},
listeners: {
load : function(store) {
store.each(function(record) {
record.commit();
});
}
}
});
我的模型看起来很完美,只是为了减少我没有放在这里的代码
这是我的网格:
Ext.define('App.view.info.List' ,{
extend: 'Ext.grid.Panel',
alias : 'widget.infolist',
store : 'Info',
initComponent: function(){
this.columns = [
{header:'PID',dataIndex:'pid'},
{header:'Name',dataIndex:'name'},
{header:'Address', dataIndex:'address'},
{header:'Contact', dataIndex:'contact'}
];
this.callParent(arguments);
}
});
这是我的php脚本返回的内容:
{'success':true, 'result':{'pid':'100','name':'Suman','address':'Bangalore','contact':'suman@xyz.com'}}
这是控制器:
Ext.define('App.controller.Info', {
extend: 'App.controller.Base',
models: ['Info'],
stores: ['Info'],
views: [
'info.Index',
'info.List'
],
refs: [{ref: 'info',selector: 'info'}],
init: function(){
console.log('Main controller init');
this.control({
'button[action=search]':{
click: this.onSearchButtonClick
}
});
},
onSearchButtonClick:function(){
var form = Ext.getCmp('ppanel');
if(form.getForm().isValid()){
Ext.Ajax.request({
waitMsg: 'Searching...',
method: 'POST',
url: 'app/scripts/Info.php',
params: {
searchData: Ext.encode(form.getValues())
},
scope:this,
success: this.onSearchSuccess,
failure: this.onSearchFailure
//Ext.MessageBox.alert("XXXXX","dat");
});
}
},
onSearchSuccess: function(response){
var gData = Ext.JSON.decode(response.responseText);
//var grid = Ext.widget('infolist'); //not working -need help
this.getInfoStore().load(gData);
//Ext.getCmp().setActiveItem('infolist'); //not working-need help
//this.getViewport().getLayout().setActiveItem('infolist'); //not working need help
Ext.MessageBox.alert("XXXXX",response.responseText); //works
},
onSearchFailure: function(err){
Ext.MessageBox.alert('Status', 'Error occured during searching...');
}
});
我希望我提供了所需的信息来理解这个问题。期待某种帮助。
答案 0 :(得分:1)
问题是你有两个商店实例,一个在网格中,一个在控制器中。 如果你想要一个实例存储(就像你想要的那样),你有两个选择:
storeId
。(如果您已将该商店添加到您的应用中,请忽略上述文字)
或者,更好的是,不要直接使用商店,而是使用您的网格,如下所示:
首先在控制器中的view->网格中添加ref
:
refs: [{ref: 'info',selector: 'info'},{selector:'infolist', ref:'infoGrid'}]
然后,在onSearchSuccess
处理程序中,您应致电:this.getInfoStore().load(gData);
this.getInfoGrid().getStore().loadData(gData);
BTW:this.getInfoStore().load(gData);
永远不会加载数据或记录数组,您应该使用:this.getInfoStore().loadData(gData);
希望这能让你走上正轨。