0

我正在使用 dgrid 0.4.0(最新)和 dstore 1.1.0。现在我对我的 dgrid 进行了过滤,例如

myDgrid.set('collection',  myStore.filter(new myStore.Filter({includeInUI: true}).or( {fruit: /apple|banana|orange/i}, {forceSell: true} )) );

myStore 有 20 行,其中任何行的 forceSell 都不为真。水果字段中有不同的值,但很少有行满足上述条件。所有行都将“includeInUI”设置为 true。我希望只显示苹果、香蕉或橙色的行,但是当我应用上述过滤器时,所有 20 行都会显示。

逻辑 OR 是否不起作用?还是我做错了什么?当我从网络套接字接收数据时,我也会向网格添加行。(使用 dgrid.put)。

我将不胜感激任何帮助。谢谢!。

4

1 回答 1

1

IncludeInUI 已在我的代码中设置。所以下面的语句有效。

myDgrid.set('collection', myStore.filter(new myStore.Filter().or(new myStore.Filter().eq('fruit','apple'), new myStore.Filter().eq('forceSell', true))));

注意:看起来 RegExp 在过滤器运算符中不被接受。所以多值情况可能会发生

grid.set('collection', store.filter(new store.Filter().or(new store.Filter().in('fruit', ['apple', 'grape']),
                                                                          new store.Filter().eq('forceSell', true))));

完整的代码是:

<head>
        <meta charset="utf-8">
        <title>Test Simple Grid Creation</title>
        <meta name="viewport" content="width=570">
        <style>
            @import "dojo/dojo/resources/dojo.css";
            @import "dojo/dijit/themes/claro/claro.css";
            .heading {
                font-weight: bold;
                padding-bottom: 0.25em;
            }
            .dgrid {
                margin: 10px;
            }

            /* add styles to size this grid appropriately */
            #grid {
                height: 20em;
            }
            #grid .field-order {
                width: 7%;
            }
            #grid .field-name {
                width: 18%;
            }
        </style>
        <script src="dojo/dojo/dojo.js"
            data-dojo-config="async: true"></script>
        <script>

            var columns = {
                id: "ID",
                fruit: "Fruit",
                includeInUI: "includeInUI",
                forceSell: "forceSell"
            };

            require(["dgrid/OnDemandGrid", "dstore/Memory", "dojo/domReady!"], function(Grid, Memory){
                var data1 = [
                    {id: 1, fruit:"apple", includeInUI:true, forceSell: false},
                    {id: 2, fruit:"banana", includeInUI:true, forceSell: false},
                    {id: 3, fruit:"grape", includeInUI:true, forceSell: false},
                    {id: 4, fruit:"apple", includeInUI:true, forceSell: false},
                    {id: 5, fruit:"banana", includeInUI:true, forceSell: false},
                    {id: 6, fruit:"apple", includeInUI:false, forceSell: false},
                    {id: 7, fruit:"banana", includeInUI:true, forceSell: false},
                    {id: 8, fruit:"grape", includeInUI:true, forceSell: false},
                    {id: 9, fruit:"apple", includeInUI:true, forceSell: false},
                    {id: 10, fruit:"banana", includeInUI:true, forceSell: false}
                ];
                var store = new Memory({data: data1});

                window.grid = new Grid({
                    columns: columns,
                    collection: store.filter({includeInUI: true}),
                    idProperty: "id",
                    id: "myGrid"
                }, "grid");
            });

        </script>

        <script>
        function filterData() {
            require(["dgrid/Grid", "dijit/registry", "dojo/domReady!"], function(Grid, registry){
                //var grid = registry.byId('myGrid');
                console.log('filterData: ', grid);
                var store = grid.collection;
                grid.set('collection', store.filter(new store.Filter().or(new store.Filter().eq('fruit','apple'), new store.Filter().eq('forceSell', true))));

            });
        }
        </script>
    </head>
    <body class="claro">
        <h2>A basic grid rendered from an array</h2>
        <div id="grid"></div>
        <div>Buttons to test filter:
            <button onClick="filterData();">Filter</button>
        </div>
    </body>
</html>

希望这可以帮助某人。

于 2015-09-05T18:47:39.460 回答