javascript - Backbone : synchronizing Models and LocalStorage

标签 javascript backbone.js local-storage backbone-local-storage

我扩展了一个模型A和一个集合如下:

define(['underscore', 'backbone', 'backbone.localStorage'], function(_, Backbone) {
   var A = Backbone.Model.extend({
      initialize: function() {          
      }
   });

   var A_Collection = Backbone.Collection.extend({
      model: A,
      localStorage: new Backbone.LocalStorage("as")
   });

   return {
      Model: A,
      Collection: A_Collection 
   };
});

集合存储在 localStorage 中,并且在我的应用程序中一切正常。然后我直接通过代码清除并替换 localStorage (使用clear和setItem函数)并尝试实例化一个新集合,但未检测到更改:

var aux = new A.Collection();
aux.fetch(); 
// aux is empty

否则如果尝试:

var aux = new A.Collection();
aux.localStorage = new Backbone.LocalStorage("as");
aux.fetch(); 
// aux contains new data 

后者对我来说无效,因为我必须修改项目中所有集合的创建。

我错过了什么?

最佳答案

Backbone.LocalStorage 实例并非旨在监听在其自身代码之外发生的 LocalStorage 更改。这就是为什么你会得到你所得到的行为。不过,有一个解决方法。

当您像这样定义集合时:

var A_Collection = Backbone.Collection.extend({
   model: A,
   localStorage: new Backbone.LocalStorage("as")
});

localStorage 值由 A_Collection 的所有实例共享。您可以自动创建 Backbone.LocalStorage 的新实例,如下所示:

var A_Collection = Backbone.Collection.extend({
  model: A,
  initialize: function() {
    A_Collection.__super__.initialize.apply(this, arguments);
    A_Collection.prototype.localStorage = new Backbone.LocalStorage("as");
  },
});

我们必须在原型(prototype)上设置它,以便它由 A_Collection 的所有实例共享,这与原始代码的行为相同。有了这个,每当您创建 A_Collection 的新实例时,您都会获得 Backbone.LocalStorage 的新实例,它将从 LocalStorage< 重新获取信息.

这是一个plunker说明。下面是相关代码,供引用:

var A = Backbone.Model.extend({
  initialize: function() {}
});

var A_Collection = Backbone.Collection.extend({
  model: A,
  initialize: function() {
    A_Collection.__super__.initialize.apply(this, arguments);
    A_Collection.prototype.localStorage = new Backbone.LocalStorage("as");
  },
});

// Setup a collection.
var collection = new A_Collection();
collection.fetch();

// Clean it out from previous runs... Note that we have to use destroy to destroy all items. 
// Reset won't save to LocalStorage.
while (collection.length > 0) {
  var model = collection.at(0);
  model.destroy();
  collection.remove(model);
}
// and set some elements.
collection.create({
  name: "1"
});
collection.create({
  name: "2"
});
console.log("collection length:", collection.length);

// Mess with it outside the Backbone code.
localStorage.clear();
// Manually create data that looks like what Backbone expects.
localStorage.setItem("as-1", JSON.stringify({
  name: "foo",
  id: "1"
}));
localStorage.setItem("as-2", JSON.stringify({
  name: "bar",
  id: "2"
}));
localStorage.setItem("as-3", JSON.stringify({
  name: "baz",
  id: "3"
}));
localStorage.setItem("as", "1,2,3");

// Create a new collection that loads from LocalStorage
var collection2 = new A_Collection();
collection2.fetch();
console.log("collection 2 length:", collection2.length);
console.log("first item", collection2.at(0).toJSON());
console.log("third item", collection2.at(2).toJSON());

console.log("instance is shared?", collection.localStorage === collection2.localStorage);

上面的代码在控制台上生成:

collection length: 2
collection 2 length: 3
first item Object {name: "foo", id: "1"}
third item Object {name: "baz", id: "3"}
instance is shared? true

关于javascript - Backbone : synchronizing Models and LocalStorage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39537031/

相关文章:

javascript - 在初始页面加载时触发 javascript,而不是在按 'Back' 按钮时触发

javascript - LinkedIn 是否为其 iPhone 应用程序使用了 PhoneGap 或 Trigger.IO?

javascript - subview 中的事件未触发 - Backbone.js

javascript - 列表的 Backbone subview

javascript - 如何使用 javascript 对象在 d3 v4 中画一条线?

根据时区以自定义格式的 javascript 日期时间

javascript - win8.1 IE11下localStorage不同步

jquery - 跨浏览器 HTML5 存储库

javascript - 如何在reactjs中从localStorage实时获取、删除、更新数据?

javascript - jquery 中此引用的范围?