在backbone-localStorage.js中参数化商店的名称

时间:2012-01-08 22:38:00

标签: backbone.js local-storage

使用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未定义。

2 个答案:

答案 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(...)并没有什么神奇之处。你只是传递一个普通的物体。当使用将该对象作为参数

调用 <{1}}时,会发生魔力

因此,对象方法Backbone.Collection.extend的options参数完全不同于传递给initialize的参数。分配的函数new Store(...)定义了选项的范围。谁知道initialize中提到的那个定义的位置。它可以是new Store(options.store),也可以是在其他范围内定义的选项。如果它未定义,则可能会出现错误

话虽这么说,我只看到两三个战略选择(哦,jeez,请原谅双关语!)。

每当您创建集合的新实例时,都可以:

  1. 传入语言,让Backbone集合在需要的地方创建window.options
  2. 预先创建商店并传递或给予特定商店想要的实例(直接通过其构造函数,或者您可以让您的构造函数“查找”相应的预先创建的商店)。
  3. 最后,我猜你可以将创建商店的任务委托给另一个对象并让它实现一个或两个选项。 (基本上是商店工厂/资源经理的事情)。
  4. 您需要弄清楚这些策略中的哪一个应该适合您。我从未使用过localStorage所以,不幸的是,在这方面我无法帮助你。我可以做的是问,是否会有从App.Wordlist创建的多个实例,可能会意外地创建两个相同类型的商店?

    事实上,我还有另外一个问题。这个new Store(..)在哪里定义?您确定没有在您正在使用的其他API库中的某个位置定义吗?仔细阅读我所知道的localStorage文档,提到Store constructor,而不是Storage。所以你可能也想弄明白。

    编辑#1:没关系,I see you mentioned where Store was defined.

答案 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');