4

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

谢谢!

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

4

2 回答 2

2

饼干怎么样?

网格小部件有一个 cookie 插件(链接),但 id 不保存过滤器。也许扩展插件或网格可能是一种选择。

将过滤器属性作为字符串传递也听起来像是一个选项。了解条件、可以使用的值或它们的类型后,您可以在将过滤器应用到网格之前轻松验证过滤器。

于 2013-09-18T10:39:59.293 回答
2

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

将过滤器存储在 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);
});

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

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

使用网络存储的一个优势是您可以存储比cookie更多的数据

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

Web 存储的浏览器兼容性

于 2013-09-19T14:13:57.217 回答