Фильтр Dojo DataGrid с использованием AndOrReadStore - что я делаю не так? - PullRequest
3 голосов
/ 15 января 2012

У меня есть следующий код, работающий с DataGrid, который имеет два столбца Column_A и Column_B соответственно:

grid.filter({Column_A: '*test*', Column_B: '*'}, true)

Этот код работает нормально и находит все строки, в которых Column_A содержит слово test ... теперь я хотел бы сделать то же самое, но посмотрите в любом столбце .... запятая переводит в операцию AND но я ищу операцию ИЛИ.

Я прочитал спецификации AndOrReadStore и, основываясь на моем понимании, я смогу сделать что-то вроде этого:

grid.filter({complexQuery: "Column_A: '*test*' OR Column_B: '*'"}, true)

однако это не работает, и я не получаю никаких результатов ... Я даже не могу заставить его работать с одним столбцом, как это

grid.filter({complexQuery: "Column_A: '*test*'"}, true)

Что я делаю не так?

Спасибо

Ответы [ 2 ]

4 голосов
/ 21 января 2012

Вот рабочий программный пример (нажмите кнопку, чтобы вызвать фильтр: Column_A содержит e ИЛИ Column_B равен 300):

JavaScript (script.js):

dojo.require("dijit.layout.ContentPane");
dojo.require("dijit.form.Button");
dojo.require("dojox.grid.DataGrid");
dojo.require('dojox.data.AndOrReadStore');

dojo.ready(function(){  
var appLayout = new dijit.layout.ContentPane({
    id: "appLayout"
}, "appLayout");

var data = {
  'items': [
    {'Column_A': 'alpha', 'Column_B': '100'},
    {'Column_A': 'beta',  'Column_B': '200'},
    {'Column_A': 'gamma', 'Column_B': '300'},
    {'Column_A': 'delta', 'Column_B': '400'}
  ]
};
var store = new dojox.data.AndOrReadStore({
    data: data      
});


var layout = [[ 
  {name : 'A', field : 'Column_A', width : '125px'},
  {name : 'B', field : 'Column_B', width : '100%'} 
]];


var grid = new dojox.grid.DataGrid({
    structure : layout,
    store: store,
    queryOptions: {ignoreCase: true}
});


    var filterButton = new dijit.form.Button({
        label: "Filter",
        onClick: function () {
            grid.filter({complexQuery: "Column_A: '*e*' OR 'Column_B: '300'"});
        }
    });

    filterButton.placeAt(appLayout.domNode);
    grid.placeAt(appLayout.domNode);

    appLayout.startup();
});

А теперь HTML (index.html)

<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>DataGrid with AndOrReadStore</title>

    <link rel="stylesheet" href="style.css" media="screen"/>   
    <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/dojo/1.7.1/dijit/themes/claro/claro.css" />
    <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/dojo/1.7.1/dijit/themes/claro/document.css" />   
    <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/dojo/1.7.1/dojox/layout/resources/ExpandoPane.css" />
    <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/dojo/1.7.1/dojox/grid/resources/claroGrid.css">
    <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/dojo/1.7.1/dojox/grid/enhanced/resources/claro/EnhancedGrid.css">

    <script src="http://ajax.googleapis.com/ajax/libs/dojo/1.7.1/dojo/dojo.js" type="text/javascript"></script>
    <script src="script.js" type="text/javascript"></script>
  </head>

  <body class="claro">
    <div id="appLayout"></div>
  </body>
</html>

И, наконец, CSS (style.css)

html, body {
  width: 100%; height: 100%;
  margin: 0; padding: 0; 
  overflow: hidden;     
}   

#appLayout {
  width: 100%; height: 100%;
} 
0 голосов
/ 15 января 2012

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

grid.filter({query: ("Column_A: '*test*' OR Column_B: '*'")}, true);

Вот ссылка, на которую я смотрел: http://dojotoolkit.org/reference-guide/dojox/data/AndOrReadStore.html#dojox-data-andorreadstore

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...