持久化设置
Serenity 2.1.5 引入保存如下信息的网格列表设置:
- 可见列和显示顺序
- 列宽
- 排序的列
- 高级过滤器(由右下角的编辑过滤器链接创建)
- 快速过滤器(撰写本文档时,尚未提供该功能)
- 包含已删除的状态切换
默认情况下,网格列表不会自动持久化任何东西。
因此,如果你隐藏某些列并离开订单页面,当你再次返回该页面时,你就会看到那些隐藏的列再次成为可见列。
你需要开启所有网格列表的持久化设置,或设置单独记住它们的设置。
默认情况下开启持久性
DataGrid 有名为 DefaultPersistanceStorage 的静态配置参数。此参数控制默认情况下的网格列表设置自动保存的位置。它最初为空。
在 ScriptInitialization.ts,你可能像下面这样默认开启所有网格列表的持久化:
namespace Serene.ScriptInitialization {
Q.Config.responsiveDialogs = true;
Q.Config.rootNamespaces.push('Serene');
Serenity.DataGrid.defaultPersistanceStorage = window.sessionStorage;
}
这将设置保存到浏览器的会话(session)。当任何浏览器窗口保持打开状态时,将数据保存到一个键/值字典。当用户关闭所有浏览器窗口时,所有的设置都会丢失。
另一种选择是使用浏览器本地存储。在浏览器重新启动之间将保留设置。
Serenity.DataGrid.defaultPersistanceStorage = window.localStorage;
使用这两个选项的任意一个,在重新加载页面之间,网格列表会开始记住它们的设置。
处理由多个用户共同使用的浏览器
SessionStorage 和 localStorage 是浏览器范围,因此,如果浏览器由多个用户共同使用,他们会得到同一组设置。
如果一个用户更改某些设置并注销,而后另一个用户登录,第二个用户将以第一个用户的设置开始使用系统(除非你在注销时清除 localStorage )。
如果你认为这是应用程序的一个问题,可以尝试编写自定义提供程序:
namespace Serene {
export class UserLocalStorage implements Serenity.SettingStorage {
getItem(key: string): string {
return window.localStorage.getItem(
Authorization.userDefinition.Username + ":" + key);
}
setItem(key: string, value: string): void {
window.localStorage.setItem(
Authorization.userDefinition.Username + ":" + key, value);
}
}
}
//...
Serenity.DataGrid.defaultPersistanceStorage = new UserLocalStorage();
请注意,上述代码不能提供任何的安全保障。它只是让用户有单独的设置。
持久化存储每个网格列表类型的设置
要开启持久化,或更改某一特定网格列表的存储目标,可重写 getPersistanceStorage 方法:
namespace Serene.Northwind {
//...
export class OrderGrid extends Serenity.EntityGrid<OrderRow, any> {
//...
protected getPersistanceStorage(): Serenity.SettingStorage {
return window.localStorage;
}
}
}
你也以在该方法中通过返回 null 关闭网格列表类的持久化。
确定保存的设置类型
默认情况下,在开始时注意到的所有设置(如可见列、宽度、过滤器等)都被保存。你也可以选择不持久化/还原特定的设置。这些都可在 getPersistanceFlags 方法控制:
namespace Serene.Northwind {
//...
export class OrderGrid extends Serenity.EntityGrid<OrderRow, any> {
//...
protected getPersistanceFlags(): GridPersistanceFlags {
return {
columnWidths: false // dont persist column widths;
}
}
}
}
这里是一组完整的标识:
interface GridPersistanceFlags {
columnWidths?: boolean;
columnVisibility?: boolean;
sortColumns?: boolean;
filterItems?: boolean;
quickFilters?: boolean;
includeDeleted?: boolean;
}
何时保存/还原设置
当你改变网格列表的如下设置时,会自动保存设置:
- 使用列选取器对话框选择可见的列
- 手动调整列的大小
- 编辑高级过滤器
- 拖动列、改变列位置
- 更改排序的列
只在创建网格列表后,在加载第一页时还原设置。
持久化设置到数据库(UserPreferences 表)
Serene 2.1.5 带有 UserPreferences 表,可以作为持久化存储设置。若要使用该表存储设置,你只需要将网格列表的 defaultPersistanceStorage 设置为存储类型(类似于其他存储类型)。
/// <reference path="../Common/UserPreference/UserPreferenceStorage.ts" />
Serenity.DataGrid.defaultPersistanceStorage = new Common.UserPreferenceStorage();
别忘了添加引用语句,否则你会有运行时错误,因为 TypeScript 有加载顺序问题。
或者:
namespace Serene.Northwind {
//...
export class OrderGrid extends Serenity.EntityGrid<OrderRow, any> {
//...
protected getPersistanceStorage(): Serenity.SettingStorage {
return new Common.UserPreferenceStorage();
}
}
}
手动保存/还原设置
如果需要手动保存/还原设置,可以使用以下方法:
protected getCurrentSettings(flags?: GridPersistanceFlags): PersistedGridSettings;
protected restoreSettings(settings?: PersistedGridSettings, flags?: GridPersistanceFlags): void;
这些都是 DataGrid 的受保护方法,所以只能从子类调用。