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