0

I am just getting started with Durandal.js so excuse me for the silly quesstion...

When a user makes it's first request to the app it is asked to choose a 'profile kind', and I need it to be accessible to every other view model in the web site, I first though of creating this property in the shell viewmodel, but don't how to do it.

How is the best way to store data in a Session like mode in a Durandal SPA?

Thanks!

4

2 回答 2

1

为您需要存储的数据创建一个 amd 模块。

然后只需要该模块作为任何其他需要它的模块的依赖项。

有点像这样:

会话模块

define(function () {
    return {
        someVariable: 'value1',
        someVariable2: 'value2'
    }
})

其他一些模块

define(['session'], function(session) {
    return {
        getValue1: function () {
            return session.someVariable;
        },
        obs1: ko.observable(session.someVariable2)
    }
})

编辑** AMD 模块不会污染窗口对象的全局命名空间。但是,如果您不想将您的会话作为依赖项,而只是通过全局变量访问它,那很好。

shell.js如果您愿意,可以在您的文件中声明它并执行以下操作:

define(function () {
    window.session = { someVariable: 'value1', someVariable2: 'value2' };
})

然后在其他一些模块中,您可以像这样访问会话对象:

define(function() {
    return {
        getValue1: function () {
            return session.someVariable;
        },
        obs1: ko.observable(session.someVariable2)
    }
})

此信息不会在页面刷新之间保留。它仅在内存中。如果您希望保留会话数据,除非您计划使您的应用程序成为离线应用程序,否则我不会考虑在客户端上保留任何信息。离线应用程序是即使没有互联网访问也可以工作的应用程序。但是,如果您的应用程序要求用户始终连接到互联网,那么我只会将会话数据存储在服务器上。因此,只需使用 Web 服务来保存会话数据并检索它。

您可以使用 cookie 将服务器上的会话绑定到客户端。

于 2013-07-05T17:11:43.437 回答
0

作为 Evan 的答案的替代方案,这绝对是正确的 AMD 方法……您是否考虑过为此目的使用全局对象?

在 main.js 中

window.myApp = {
    prop1: 'value',
    subOne: {
         prop1: 'value'
    } 
   ... 
}

这将允许您在任何地方访问全局myApp对象。我知道有些人会认为这是全局命名空间污染并且通常是一种不好的做法,但是在 SPA 项目(您可以控制的地方window)中,我认为这仍然是一种可行的方法。

于 2013-07-08T14:00:28.030 回答