Backbone.js 在路由之间持久化数据而不转到服务器?
我正在为我的主干网应用程序进行登录,遇到了一个问题,我不知道如何在不调用服务器的情况下解决。这在我的团队中引发了一场讨论,讨论了其他人在主干中处理此类事情的方式,因为我们认为,在前进的道路上,我们将遇到类似的事情 今天是星期五,我可能只是脑死亡,但现在 我们有一个用户模型。视图的login方法创建一个新的用户模型,并调用它的login方法传递用户的凭证和回调函数,回调函数有一个包含用户信息的对象 以下是我们视图的登录方法: 我们试图弄清楚的是如何最好地将此模型数据提供给另一条路线(家),以便我们可以在视图中使用它 所以我有一个路由器:Backbone.js 在路由之间持久化数据而不转到服务器?,backbone.js,Backbone.js,我正在为我的主干网应用程序进行登录,遇到了一个问题,我不知道如何在不调用服务器的情况下解决。这在我的团队中引发了一场讨论,讨论了其他人在主干中处理此类事情的方式,因为我们认为,在前进的道路上,我们将遇到类似的事情 今天是星期五,我可能只是脑死亡,但现在 我们有一个用户模型。视图的login方法创建一个新的用户模型,并调用它的login方法传递用户的凭证和回调函数,回调函数有一个包含用户信息的对象 以下是我们视图的登录方法: 我们试图弄清楚的是如何最好地将此模型数据提供给另一条路线(家),以便我们
routes: {
'': 'home',
'home': 'home',
'login': 'login'
},
home: function(data){
console.log(data);
}
用户登录后,我们需要更新路由并访问该用户的数据,但不想返回服务器获取数据
我很担心,因为我们正在构建一种“向导”,用户可能需要通过某些步骤前后移动,我不想每次浏览应用程序时都点击服务器,但看起来我们要么需要将内容保存到全局变量(不想这样做)或者每次都返回服务器。我相信其他人也不得不处理类似的问题。只是想了解一些情况
谢谢 使用本地存储
修改代码以执行以下操作:
// success callback
if (msg.loggedIn) {
console.log("Authenticate successful: " + JSON.stringify(msg));
var data = { user : msg, bob : "bob", trigger:true };
var dataString = JSON.stringify(data);
console.log("Prepared data: " + dataString;
window.localStorage.setItem("userdata",dataString);
App.router.navigate('home',data);
try {
var userData = window.localStorage.getItem ("userdata");
} catch (e) {
// Do something
}
现在,无论何时需要检查用户是否已登录,请执行以下操作:
// success callback
if (msg.loggedIn) {
console.log("Authenticate successful: " + JSON.stringify(msg));
var data = { user : msg, bob : "bob", trigger:true };
var dataString = JSON.stringify(data);
console.log("Prepared data: " + dataString;
window.localStorage.setItem("userdata",dataString);
App.router.navigate('home',data);
try {
var userData = window.localStorage.getItem ("userdata");
} catch (e) {
// Do something
}
try-catch是必要的,以确保如果身份验证从未成功,代码不会呕吐
“看起来我们要么需要将内容保存到全局变量(不希望这样做)”
陈述显而易见的事实:你需要保持状态。您可以选择将状态传输到服务器并返回,或者在客户端保留状态。由于您已经确定不希望通过服务器传递状态,因此您需要在客户端的不同页面(路由)之间保留状态
这就是全局变量的作用。我知道这听起来很恶心,但这也是单页应用程序带来的主要好处之一。庄严。这种状态将始终由某个全局对象保持
管理国家的方式有好有坏。让一个名为data
的全局变量不断赋值和重新赋值显然是最糟糕的方式。你应该找出一个适合你需求的模式
如果我正确理解了您的代码示例,那么您要存储的是关于当前用户的信息。您似乎已经有了一个全局变量App
。我突然想到,保留某种会话
信息是个好主意:
login: function(data){
doLogin({
success: function(userData) {
App.session.currentUser = userData;
App.router.navigate('home', { trigger:true });
}
});
},
home: function(data){
if(!App.session || !App.session.currentUser) {
App.router.navigate('login', { trigger:true });
return;
}
var user = App.session.currentUser;
//do something with user
}
国家不一定是邪恶的。邪恶的是依赖于整个应用程序的全局状态,这很容易导致不稳定的意大利面代码。但是,如果您将状态依赖性解析为链中尽可能高的位置(例如在路由器中),并使用构造函数和方法参数向下传递值,那么您仍然可以在代码库的其余部分保持可测试性和无副作用
对不起,我没有银弹给你。其中有一些库可以帮助管理状态、转换等,但本质上它们不会做任何你自己做不到的事情。回复太晚了,但还有一种更好的方法,这取决于你使用的路由器引擎,并且没有局部变量。 我将尝试给出一个使用主干网的通用示例,它适用于所有人 一般来说,你的路由器会在一个地方处理事情。假设它的主干让路由定义如下
var router = Backbone.Router.extend({
routingData: {}, // this will have the routing data
routes: {
'': 'home',
'home': 'home',
'login': 'login'
},
navigate: function(url, data) {
this.routingData["data"] = data; // whenever navigation is done, this will be reset
//This is the routing code whichever the f/w may be.
Backbone.Router.prototype.navigate(route, { trigger: true });
},
home: function(data) {
var params = this.routingData["data"]; //retreiving the routing params
console.log(params);
}
})
现在,如果您想传递数据,您可以这样做
router.navigate(<URL>,<SOME DATA>)
路由器。导航(,)
+1用于在脑死亡时发帖!:P