Backbone.js 在路由之间持久化数据而不转到服务器?

Backbone.js 在路由之间持久化数据而不转到服务器?,backbone.js,Backbone.js,我正在为我的主干网应用程序进行登录,遇到了一个问题,我不知道如何在不调用服务器的情况下解决。这在我的团队中引发了一场讨论,讨论了其他人在主干中处理此类事情的方式,因为我们认为,在前进的道路上,我们将遇到类似的事情 今天是星期五,我可能只是脑死亡,但现在 我们有一个用户模型。视图的login方法创建一个新的用户模型,并调用它的login方法传递用户的凭证和回调函数,回调函数有一个包含用户信息的对象 以下是我们视图的登录方法: 我们试图弄清楚的是如何最好地将此模型数据提供给另一条路线(家),以便我们

我正在为我的主干网应用程序进行登录,遇到了一个问题,我不知道如何在不调用服务器的情况下解决。这在我的团队中引发了一场讨论,讨论了其他人在主干中处理此类事情的方式,因为我们认为,在前进的道路上,我们将遇到类似的事情

今天是星期五,我可能只是脑死亡,但现在

我们有一个用户模型。视图的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