DurandalJS:在会话中保存数据

时间:2014-04-14 12:32:22

标签: javascript durandal durandal-2.0

我决定为我的AJAX请求,模型和数据数组创建一个名为“controllers”的独立文件夹,所以如果我需要在多个页面上使用相同的请求,我就不必重复我的代码。

例如,在“app / page1 / index.html”上,我有一个包含所有用户的列表:

<ul data-bind="foreach: { data: usersArr }">
  <li data-bind="text: full_name"></li>
</ul>

我需要page1的viewmodel中的用户控制器,然后通过它加载数据:

define(['jquery', 'knockout', 'controllers/user/index'], function ($, ko, User) {
  var Page1 = function() {
    this.usersArr = User.usersArr;
  };

  Page1.prototype.activate = function() {
    User.getUsers();
  };

  return Page1;
});

这是用户控制器:

define(['knockout', './models',], function (ko, Model) {
  var UserController = function() {
    this.usersArr = ko.observableArray();
  };

  // inherit
  UserController.prototype.Model = new Model();

  UserController.prototype.getUsers = function () {
    // ajax goes here, data comes back,
    // put it through the Model and then save it to usersArr();
  };

  UserController.prototype.addUser = function () { ... };
  UserController.prototype.removeUser = function () { ... };

  return new UserController();
});

请注意,我将控制器作为对象返回。我这样做是为了让它保留在内存中,我可以重用其他页面上的代码(特别是带有存储数据的可观察数组)。现在,如果我创建一个'page2'并且需要相同的列表,则用户将已加载到usersArr可观察数组中。

我有多个这样的控制器,应用程序将在整个会话中使用。我只是想知道这种方法是否有任何缺点,比如应用程序减速或我可能遇到的任何其他问题。我也很想知道你们是否有不同的方法来保持会话中的数据。

谢谢!

2 个答案:

答案 0 :(得分:2)

我发现在SPA中保留信息的最佳方式是在所有视图中创建一个单例并引用该单例。

例如,这是我的一个修改版本:

define([], function() {
    "use strict";
    var countryList: []    


    return {
      countryList: countryList,

    };
});

然后我只需要在我的所有SPA上使用它。 CountryList由第一个视图[1]填写,数据可供所有其他人使用。

[1]在这个上下文中我们正在制作一个向导,所以他们必须按顺序浏览视图。

答案 1 :(得分:0)

我使用本地存储/会话存储中内置的浏览器来存储会话参数。即在js:

// set data    
sessionStorage["key"] = someJsVar;
// get data
var myJsVar = sessionStorage["key"];