Dojo setQuery () на DataGrid - все элементы исчезают? - PullRequest
0 голосов
/ 17 ноября 2011

Я ломал голову, провел массу исследований и тестирований и не могу понять, что происходит.

У меня есть таблица данных Dojo, которая статически объявляется с помощью некоторого HTML.Используя графический интерфейс, мои пользователи будут добавлять элементы в DataGrid, который работает как надо.Тем не менее, я хотел бы иметь функцию, которая вызывается в определенный момент, который использует setQuery Dojo для фильтрации данных, которые отображаются в DataGrid.Проблема заключается в том, что после запуска команды setQuery ВСЕ данные в сетке исчезают, независимо от того, соответствует ли он запросу!

Вот пример кода:

var layoutItems = [[
    {
        field: "id",
        name: "ID",
        width: '5px',
        hidden: true
    },
    {
        field: "color",
        name: "Color",
        width: '80px'
    }
]];

// Create an empty datastore //
var storeData = {
    identifier: 'id',
    label: 'id',
    items: []
}
var store3 = new dojo.data.ItemFileWriteStore( {data : storeData} );

...

<div id="grid" dojoType="dojox.grid.DataGrid" jsId="grid5" store="store3" structure="layoutItems" queryOptions="{deep:true}" query="{}" rowsPerPage="40"></div>

...

function filterGrid() {
    dijit.byId("grid").setQuery({color:"Red"});
}

....

function addItemToGrid(formdata) {
    var jsonobj = eval("(" + dojo.toJson(formData, true) + ")");

    var myNewItem = {
        id: transactionItemID,
        color: jsonobj.color
    };
    // Insert the new item into the store:
    store3.newItem(myNewItem);
    store3.save({onComplete: savecomplete, onError: saveerror});
}

Ответы [ 2 ]

0 голосов
/ 21 ноября 2011

Вот еще один вариант, который я придумал, чтобы фильтр не запускался без необходимости каждые x миллисекунд;он в основном использует JavaScript для создания нового setInterval, который запускается один раз через 500 миллисекунд, а затем выполняет clearInterval, чтобы он не запускался снова.Похоже, просто вызвать функцию filterTheDataGrids () после добавления элемента не удастся ... нам нужно задержаться на долю секунды, а затем вызвать ее:

// PUT THIS IN THE <HEAD> OF THE PAGE
<script type="text/javascript">
    // Declare the global variables
    var refreshDataGrid;
    var refreshDataGridInterval = 500;    // Change this as necessary to control how long to wait before refreshing the Data Grids after an item is added or removed.
</script>

.

// PUT THIS IN THE <HEAD> OF THE PAGE
<script type="text/javascript">
    function filterTheDataGrids() {
         if (dijit.byId("grid") != undefined) {
              dijit.byId("grid").filter({color: "Red"});
         }
         clearInterval (refreshDataGrid);    // Running the filter just once should be fine; if the filter runs too quickly, then make the global refreshDataGridInterval variable larger
    }
</script>

.

// PUT THIS IN THE <HEAD> OF THE PAGE
<script type="text/javascript">
    // SETUP THE LAYOUT FOR THE DATA //
    var layoutItems = [[
    {
        field: "id",
        name: "ID",
        width: '5px',
        hidden: true
    },
    {
        field: "color",
        name: "Color",
        width: '80px'
    }
]];

// Create an empty datastore //
var storeData = {
    identifier: 'id',
    label: 'id',
    items: []
}
var store3 = new dojo.data.ItemFileWriteStore( {data : storeData} );
</script>

.

 // PUT THIS IN THE <HTML> OF THE PAGE
<div id="grid" dojoType="dojox.grid.DataGrid" jsId="grid5" store="store3" structure="layoutItems" query="{ type: '*' }" clientSort="true" rowsPerPage="40"></div>

.

<script type="text/javascript">
function addItemToGrid(formdata) {
    // THIS FUNCTION IS CALLED BY A DIALOG BOX AND GETS FORM DATA PASSED TO IT //
    var jsonobj = eval("(" + dojo.toJson(formData, true) + ")");

    var myNewItem = {
        id: transactionItemID,
        color: jsonobj.color
    };
    // Insert the new item into the store:
    store3.newItem(myNewItem);
    store3.save({onComplete: savecomplete, onError: saveerror});

    // Create setInterval on the filterTheDataGrids function; since simple calling the function won't do; seems to call it too fast or something
    refreshDataGrid = setInterval(function() {  filterTheDataGrids();   }, refreshDataGridInterval);
}
</script>
0 голосов
/ 18 ноября 2011

Удалось исправить это, запустив сеточный ФИЛЬТР вместо setQuery периодически в фоновом режиме с помощью некоторого jQuery (не уверен, что setQuery сработал бы также, я не знаю разницу между filter и setQuery, но фильтр делает то, что мне нужно) .

Вот пример кода; надеюсь, что это поможет кому-то еще, имеющему проблемы с этим:

// ADD JQUERY
<script src="http://code.jquery.com/jquery-latest.js"></script>

.

// PUT THIS IN THE <HEAD> OF THE PAGE
<script type="text/javascript">
    $(document).ready(function() {
        function filterTheDataGrid() {
            if (dijit.byId("grid") != undefined) {
                dijit.byId("grid").filter({color: "Red"});
            }
        }
    // RUN THE filterTheDataGrid FUNCTION EVERY ONE SECOND (1000 MILLISECONDS) //
    // LOWER '1000' FOR FASTER REFRESHING, MAYBE TO 500 FOR EVERY 0.5 SECOND REFRESHES //
    var refreshDataGrid = setInterval(function() {  filterTheDataGrid();    }, 1000);
    }
</script>

.

// PUT THIS IN THE <HEAD> OF THE PAGE
<script type="text/javascript">
    // SETUP THE LAYOUT FOR THE DATA //
    var layoutItems = [[
    {
        field: "id",
        name: "ID",
        width: '5px',
        hidden: true
    },
    {
        field: "color",
        name: "Color",
        width: '80px'
    }
]];

// Create an empty datastore //
var storeData = {
    identifier: 'id',
    label: 'id',
    items: []
}
var store3 = new dojo.data.ItemFileWriteStore( {data : storeData} );
</script>

.

 // PUT THIS IN THE <HTML> OF THE PAGE
<div id="grid" dojoType="dojox.grid.DataGrid" jsId="grid5" store="store3" structure="layoutItems" query="{ type: '*' }" clientSort="true" rowsPerPage="40"></div>

.

<script type="text/javascript">
function addItemToGrid(formdata) {
    // THIS FUNCTION IS CALLED BY A DIALOG BOX AND GETS FORM DATA PASSED TO IT //
    var jsonobj = eval("(" + dojo.toJson(formData, true) + ")");

    var myNewItem = {
        id: transactionItemID,
        color: jsonobj.color
    };
    // Insert the new item into the store:
    store3.newItem(myNewItem);
    store3.save({onComplete: savecomplete, onError: saveerror});
}
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...