使用 localStorage 适配器更新 Backbone 模型

updating a Backbone model with localStorage adapter

我将 localStorage 适配器与 Backbone 一起使用,并且有一个设置模型,我可以在其中存储一些基本设置。在 init 函数中,我创建了这样的设置模型

window.onload = function() {

    window.settings = new Settings();

如果用户决定更改设置,我会在 updateSettings 函数中执行此操作

settings.save({language: lang});

但它并没有替换 localStorage 中的设置,它(如该问题的第二个答案中所述 Saving a model in local storage)每次都只是创建一个新的存储项,因此每次设置更改时,都会创建一个新实例被存储。这意味着当我在初始化后在我的视图中加载设置时,我必须将语言设置设置为存储数组中的最后一项

s[s.length - 1].language

整个函数看起来像这样

$.when(products.fetch(), settings.fetch())

            .done(function(p, s){
            var l = s[s.length - 1] ? s[s.length - 1].language : 'en-us';                       
                settings.set({'language': l});   
                _this.render();

            });
    }

但这非常不切实际,因为我不想将设置更改的整个历史记录存储在本地存储中。正如链接到的第一个 SO 答案所说,我应该在模型上使用一个 id。但是如果我像这样在应用程序初始化中分配一个 id

window.onload = function() {

    window.settings = new Settings({id: 1});

我的应用程序从不呈现,即它永远不会调用此代码中的呈现函数(我假设这是因为没有记录)。问题:如何在这里调用 fetch

  $.when(products.fetch(), settings.fetch())

                .done(function(p, s){
                var l = s[s.length - 1] ? s[s.length - 1].language : 'en-us';                       
                    settings.set({'language': l});   
                    _this.render();

                });
        }

所以我所做的是在没有分配 id 的情况下在应用程序 init 中创建模型

window.onload = 函数() {

    window.settings = new Settings();

然后当我在视图的初始化程序中调用这个模型的 fetch 时,我像这样分配 id,这样 fetch 总是 returns

   $.when(products.fetch(), settings.fetch())

                .done(function(p, s){
                var l = s[s.length - 1] ? s[s.length - 1].language : 'en-us';                       
                    settings.set({'language': l, });
                    settings.set({id :1 });
                    settings.save();   
                    _this.render();

                });
        }

然后当我像这样更改更新设置功能中的设置时

settings.save({language: lang});

但是,如果我更改设置并刷新页面几次,很明显整个设置历史记录都保存到 localStorage

settings-1: "{"0":{"language":"de",","id":1},"language":"ja","id":1}"

(注意,实际上我保存的不仅仅是语言设置)

问题:如何在 Backbone 模型上设置 ID,以便 localStorage 更新存储中的模型(而不是保留更新历史记录)?

将 localStorage 适配器与单例资源一起使用没有多大意义。 我建议在您的设置 Backbone 模型中实施同步方法。 查看 Backbone 文档,但通常函数签名是: function(method, model, options) 方法可以是:read, create, update, delete 只需使用 localStorage.getItem 和 localStorage.setItem,像这样的东西应该可以工作:


sync: function(method, model, options) {
  var key = 'settings';
  switch(method) {
    case 'read':
      try {
        data = JSON.parse(localStorage.readItem(key));
        model.set(data);
      } catch(e) {}      
      break;
    case 'update'
    case 'create'
      localStorage.setItem(key, JSON.stringify(model.toJSON()));
      break;
    case 'delete'
      localStorage.setItem(key, null)
  }
}

我没测试过,不过应该是这样的。