我在哪里将用户特定(会话)信息存储在ExtJS MVC应用程序中?
定义一个自定义基本控制器是否正确,该控制器可以包含具有用户特定信息的对象并在应用程序中使用它?
示例:
Ext.define("MyApp.controller.BaseController", {
extend: "Ext.app.Controller",
session: Ext.create("MyApp.lib.UserSession"),
init: function() {
var me = this;
me.session.init();
/** some code **/
},
doSomething: function() {
var me = this;
var counter = me.session.get("counter");
}
});
答案 0 :(得分:5)
如果您需要在页面刷新后保留数据,可以使用Ext.state.Manager。
在应用启动期间,使用 Cookie 或 LocalStorage 提供商设置状态管理器:
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
// Shortcut for quick reference across the project, if MyApp.user is null - user is not authorized.
MyApp.user = Ext.state.Manager.get('user');
在授权或其他操作后保存为当前用户保留的数据:
Ext.state.Manager.set('user', {
first_name: 'John'
last_name: 'Doe'
});
答案 1 :(得分:0)
我做了一些不同的应用程序,这些应用程序涉及用户在首次启动应用程序时从其会话中提取的特定权限设置。
我努力做到这一点有几种不同的方式,但我开始认识到用户权限数据在MVC的MODEL上下文中最适合。考虑到这一点,我决定把它全部放在商店里。
这很好地解决了。如果您按照MVC指南创建商店,则始终可以使用Ext.getStore('SessionStoreId')
答案 2 :(得分:0)
我根据应用目标做两种方式。
我首选的方法是为我想要在本地保存的模型使用LocalStorage代理,这样我在应用程序中与它们交互的方式没有变化,并且在重新启动应用程序以进行设置时更加方便淘汰数据库电话。
或者,我在启动应用程序时创建一个全局变量。在启动功能内部执行类似的操作。
var app = Ext.application({
name: 'MyApp',
launch: function() {
MyApp.model.User.load('profile', {
scope: this,
success: function(user) {
// Setup the app space under your Application namespace
// so you don't conflict with anything the the ExtJS framework has set
MyApp.app.user = user;
}
}
}
}
在整个应用程序中,您可以通过变量MyApp.user
访问当前用户的模型,这样就可以在应用程序的所有区域中使用
var currentUserName = MyApp.app.user.get('name');
这样做的缺点是你引入了一个全局变量,当它可以避免时,它被认为是不好的做法。
我没有看到像你建议的那样构建一个基本控制器有什么问题,但如果你纯粹是为了访问你想要存储的会话变量,我会建议它可能有点矫枉过正。
答案 3 :(得分:0)
我几乎总是为这些事情创建一个State Manager类。您还可以使用自己的自定义代码创建单例类,并将其包含在您的应用中,如下所示:
Ext.Loader.setPath('MyApp.Util', 'app/util');
按照要求做一个要求:
Ext.require('MyApp.Util.Class')
班级本身应该是这样的:
Ext.define("MyApp.Util.Class", {
singleton : true,
options : {},
myFunction: function(){}
});
通过这种方式,您可以将所有非ExtJS功能放在单独的类中。