【问题标题】:Parameterizing the name of the store in backbone-localStorage.js在backbone-localStorage.js中参数化存储的名称
【发布时间】:2012-02-05 14:36:43
【问题描述】:

为 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'});

问题是,我还没有在任何其他示例中真正看到过这样做,我想知道那里是否有人会有任何“哎呀!不要那样做,因为......”之类的反应。

编辑

我应该补充一点,我已经尝试过这样做:

App.WordList = Backbone.Collection.extend({

  initialize : function(models, options){
  },

  localStorage : new Store(options.store)

}

然后:

  chinese = new Wordlist([], {language: 'Chinese'});

但由于某种原因,options.store 即将出现未定义。

【问题讨论】:

  • 从语法上讲,在您的 localStorage : new Store(options.store) 示例中,options 不是您正在制作的集合的任何内容的本地。它必须在某些外部环境中定义。在这种情况下,options 本身很可能是未定义的。
  • 不是initialize()本地吗?

标签: backbone.js local-storage


【解决方案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 被调用时,魔法就会发生该对象作为参数

因此,对象方法initialize 的options 参数与传递给new Store(...) 的完全不同。分配给initialize 的函数正在定义选项的范围。谁知道new Store(options.store) 中提到的那个是在哪里定义的。它可以是window.options,也可以是在其他范围内定义的选项。如果未定义,您可能会收到错误

话虽如此,我只看到两三个战略选择(哦,天哪,请原谅双关语!)。

无论何时创建集合的新实例,都可以:

  1. 传入语言,让您的 Backbone 集合在需要的地方创建 new Store(..)
  2. 预创建 Store 并将特定的 Store 希望传递给该实例(直接通过其构造函数,或者您可能让构造函数“查找”适当的预创建 Store)。
  3. 最后,我想您可以将创建商店的任务委托给另一个对象,并让它实现选项一或二。 (基本上是商店工厂/资源管理器之类的东西)。

你需要弄清楚哪些策略适合你。我从未使用过 localStorage,所以很遗憾,在这方面我无法为您提供帮助。我能做的是问,是否会从 App.Wordlist 创建多个实例,其中可能会意外创建两个相同类型的商店?

事实上,我还有一个问题。这个Store 在哪里定义?您确定没有在您正在使用的其他 API 库中的某个地方定义吗?仔细阅读我所知道的 localStorage 文档,提到了 Storage constructor,但没有提到 Store。因此,您可能也想弄清楚这一点。

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

【讨论】:

    【解决方案2】:

    我通过创建一个允许您在实例化后配置 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'); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-17
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多