我有一个 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 data比cookies can .
您可以想象使用 cookie 作为不支持本地存储的浏览器的回退,(即当 supportsLocalStorage()
返回 false
时),代价是添加一个为您的设计增加更多开销,因此最终由您决定,具体取决于您想要支持的浏览器。
关于javascript - 如何在 Dojo 中保存过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18709142/