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

我有一个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
});

使用Web存储的一个优点是您可以存储much more data而不是cookies can.

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

Browser Compatibility for Web Storage

上一篇:javascript – Akeneo:以编程方式选择网格过滤器


下一篇:c# – 通知WPF DataGrid更改