Extjs - загрузка сетки при вызове

У меня есть форма и сетка. пользователь должен ввести данные в поля формы, а затем отобразить связанные записи в сетке. Я хочу внедрить форму поиска, например: пользователь введет имя и пол студента, затем получит сетку, в которой все студенты имеют одинаковое имя и пол.

Итак, я использую 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);

2 ответа

Решение

Хорошо... Я думаю, что могу помочь, но это потребует немного иного мышления, чем то, что вы делаете сейчас.

Создав хранилище, вы дали ему прокси, который можно использовать для вызовов AJAX. Это не заставляло его отслеживать вызовы ajax по определенному URL. Поэтому, когда вы определили свой магазин и дали ему идентификатор, он зарегистрировал экземпляр этого магазина внутри менеджера магазина. Затем вы должны использовать прокси этого хранилища для загрузки данных в него, как это происходит в вашем контроллере:

контроллер:

//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
    }
});

Предполагая, что все настроено прямо в прокси (выглядит хорошо) и что сервер получает и правильно отвечает на запрос, настроенный прокси должен декодировать данные JSON, которые возвращает ваш веб-сервис, декодировать их в объект javascript, получить свойство Arr и преобразуйте каждый элемент в экземпляр определенной модели. Затем он автоматически добавит их в таблицу, и вы получите желаемый результат.

Я не совсем уверен, смогу ли я следовать за вами... Как вы фильтруете? Локально, в выгружаемом магазине, кажется?

Я рекомендую вам использовать remoteFilter: true в магазине. Теперь вы можете применить хотя бы один параметр фильтра на стороне сервера, в противном случае вернуть пустой набор результатов.

Обратите внимание, что свойство фильтра, отправленное на сервер, будет выглядеть так:

Filters:[{property:"FieldName", value: "anyValue"}] // objectview
Другие вопросы по тегам