javascript - 如何在 Dojo 中保存过滤器

标签 javascript datagrid dojo dojox.grid.datagrid

我有一个 EnhancedGrid,用户经常在上面使用复杂的过滤器。有没有办法让用户保存或收藏过滤器,以便他们将来可以轻松地重新应用它?我知道我可以以编程方式设置过滤器,但我无法预测我的用户需要什么过滤器。

谢谢!

编辑:我自己取得了一些进展...使用 grid.getFilter() 返回过滤器的 JSON 表示,然后 json.stringify(jsonRepresentation) 将其转换为字符串。现在我正在考虑如何存储、加载和转换该字符串的选项。将一个字符串加载到一个 json 对象中,然后将其应用为我的过滤器是否会使我面临 XSS 漏洞?如果我想在 url 中将过滤器指定为参数,我可以压缩字符串以减少字符数吗?

最佳答案

马上,这是我看到的两个三种方法:

将过滤器存储在 URL 中(好的)

只需获取 window.location 并使用 dojo/io-query::queryToObject() 解析查询字符串:

require(['dojo/io-query'], function (ioQuery) {
    var uri = window.location.href;
    var query = uri.substring(uri.indexOf("?") + 1, uri.length);
    query = ioQuery.queryToObject(query);
});

( Documentation for dojo/io-query )


将过滤器存储在 cookie 中(更好)

dojo/cookie 模块让这一切变得非常非常简单:

require(['dojo/cookie', 'dojo/json'], function (cookie, json) {
    var filter = { ... };
    cookie("myFilter", json.stringify(filter)); //store the cookie
    // json.parse(cookie("myFilter")); 
    // ^-- returns the cookie as a JS object
});

( Documentation for dojo/cookie )

显然,用户必须启用 cookie 才能工作,但这比在 URL 中存储一堆变量以供他们添加书签要干净得多。


按照 Dimitri M 的建议使用 HTML5 本地存储 : (更好)

检查用户的代理是否支持本地存储,如果支持,则使用该全局变量保留过滤器:

require(['dojo/json'], function(json) {
    function supportsLocalStorage() {
        return ('localStorage' in window) && window['localStorage'] !== null;
    }

    var filter = { ... };

    if(supportsLocalStorage()) {
        localStorage.setItem("myFilter", json.stringify(filter));
    }

    // json.parse(localStorage.getItem("myFilter")) 
    // ^-- returns the filter as a JS object
});

使用网络存储的一个优势是您可以存储 much more datacookies can .

您可以想象使用 cookie 作为不支持本地存储的浏览器的回退,(即当 supportsLocalStorage() 返回 false 时),代价是添加一个为您的设计增加更多开销,因此最终由您决定,具体取决于您想要支持的浏览器。

Browser Compatibility for Web Storage

关于javascript - 如何在 Dojo 中保存过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18709142/

相关文章:

javascript - 在当前 div 和下一个隐藏上显示隐藏的 div

javascript - 查找并选择不包含按钮的 "li"

c# - WPF DataGrid 行/列/单元格突出显示

javascript - 使用实用创建的小部件动态设置 dijit/form 操作

javascript - 如何在钛项目中包含 Dojo 图表

javascript - Vuejs 2.x 单击非 ul 链接时如何删除事件类

javascript - jquery修改url获取参数

wpf - DataGrid - 使用 MVVM 绑定(bind)到列表列表

c# - WPF - DataGrid 仅显示基类的属性

javascript - 排序 Dojo EnhancedGrid 要求用户单击标题边缘附近的狭窄区域