在extjs-mvc中提交建立搜索申请表并在网格中显示结果

时间:2012-12-13 06:03:32

标签: extjs extjs4 search-engine extjs-mvc

我正在尝试使用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...');
    }
});

我希望我提供了所需的信息来理解这个问题。期待某种帮助。

1 个答案:

答案 0 :(得分:1)

问题是你有两个商店实例,一个在网格中,一个在控制器中。 如果你想要一个实例存储(就像你想要的那样),你有两个选择:

  1. 将其添加到您的应用程序
  2. 为商店定义分配storeId
  3. (如果您已将该商店添加到您的应用中,请忽略上述文字)

    或者,更好的是,不要直接使用商店,而是使用您的网格,如下所示:

    首先在控制器中的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);

    希望这能让你走上正轨。