使用Backbone.js的localStorage插件的标准方法是这样的:
App.WordList = Backbone.Collection.extend({
initialize : function(models, options){
},
localStorage : new Store('English')
}
但我想用不同的语言制作不同的,平行的词汇表集合。所以,我希望能够在初始化集合时实例化Store的名称。 AFAICT,这项工作正常:
App.WordList = Backbone.Collection.extend({
initialize : function(models, options){
this.localStorage = new Store(options.language);
}
}
然后我可以实例化一个WordList:
english = new Wordlist([], {language: 'English'});
或者:
chinese = new Wordlist([], {language: 'Chinese'});
问题是,我还没有真正看到过其他任何一个例子,我想知道是否有人会有任何“Eek!不要那样做,因为......”各种各样的反应。 / p>
修改
我应该补充一点,我已经尝试过这样做了:
App.WordList = Backbone.Collection.extend({
initialize : function(models, options){
},
localStorage : new Store(options.store)
}
然后:
chinese = new Wordlist([], {language: 'Chinese'});
但出于某种原因options.store
未定义。
答案 0 :(得分:1)
更容易解释自己作为答案,所以我会继续给你一个。
在:
App.WordList = Backbone.Collection.extend({
initialize : function(models, options){
....
},
localStorage : new Store(options.store)
})
这与
完全不同var newInstanceConfig = {
initialize : function(models, options){
....
},
localStorage : new Store(options.store)
}
App.WordList = Backbone.Collection.extend(newInstanceConfig);
以这种方式思考;将对象传递给Backbone.Collection.extend(...)
并没有什么神奇之处。你只是传递一个普通的物体。当使用将该对象作为参数
因此,对象方法Backbone.Collection.extend
的options参数完全不同于传递给initialize
的参数。分配的函数new Store(...)
定义了选项的范围。谁知道initialize
中提到的那个定义的位置。它可以是new Store(options.store)
,也可以是在其他范围内定义的选项。如果它未定义,则可能会出现错误
话虽这么说,我只看到两三个战略选择(哦,jeez,请原谅双关语!)。
每当您创建集合的新实例时,都可以:
window.options
。您需要弄清楚这些策略中的哪一个应该适合您。我从未使用过localStorage所以,不幸的是,在这方面我无法帮助你。我可以做的是问,是否会有从App.Wordlist创建的多个实例,可能会意外地创建两个相同类型的商店?
事实上,我还有另外一个问题。这个new Store(..)
在哪里定义?您确定没有在您正在使用的其他API库中的某个位置定义吗?仔细阅读我所知道的localStorage文档,提到Store
constructor,而不是Storage
。所以你可能也想弄明白。 击>
答案 1 :(得分:0)
我通过创建一个允许你在实例化后配置localStorage的方法解决了这个问题:
var PageAssetCollection = Backbone.Collection.extend ({
initialize: <stuff>
model: <something>
...
setLocalStorage: function ( storageKey ) {
this.localStorage = new Backbone.LocalStorage(storageKey),
},
});
然后,您可以在设置集合后设置localStorage:
fooPageAssets = new PageAssetCollection();
fooPageAssets.setLocalStorage('bar');