Параметризация имени магазина в backbone-localStorage.js - PullRequest
2 голосов
/ 09 января 2012

Стандартный способ использования плагина localStorage для Backbone.js работает следующим образом:

  App.WordList = Backbone.Collection.extend({

    initialize : function(models, options){
    },

    localStorage : new Store('English')

  }

Но я хочу создать разные параллельные коллекции списков слов на разных языках.Итак, я хочу иметь возможность создавать имя магазина при инициализации коллекции.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 выходит неопределенным.

Ответы [ 2 ]

1 голос
/ 14 января 2012

Проще объяснить себя как ответ, поэтому я продолжу и дам один.

В:

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 полностью отличается от того, который передается в new Store(...).Назначаемая функция initialize определяет область действия опций.Кто знает, где определяется тот, о котором говорится в new Store(options.store).Это может быть window.options или параметры, определенные в некоторой другой области.Если он не определен, вы, вероятно, получите ошибку

При этом я вижу только два или три стратегических варианта (о боже, простите за каламбур, пожалуйста!).

Всякий раз, когда высоздайте новый экземпляр коллекции, либо:

  1. Перейдите на язык и позвольте вашей коллекции Backbone создать new Store(..), где это необходимо.
  2. Предварительно создайте хранилища и передайте либоили дать конкретное желание Store этому экземпляру (либо непосредственно через его конструктор, либо, возможно, у вас есть конструктор, который "ищет" соответствующий предварительно созданный Store).
  3. И, наконец, я полагаю, вы могли бы делегировать задачусоздания хранилищ для другого объекта и заставить его реализовать один или два варианта.(В основном, это вроде Factory Store / Resource Manager).

Что вам нужно выяснить, - это какая из этих стратегий должна работать для вас.Я никогда не использовал localStorage, поэтому, к сожалению, я не могу помочь вам в этом.Что я могу сделать, это спросить, будет ли когда-нибудь несколько экземпляров, созданных из App.Wordlist, где могут случайно быть созданы два одинаковых магазина?

На самом деле, у меня естьДругой вопрос.где это Store определено?Вы уверены, что это не определено где-то в одной из ваших других библиотек API, которые вы используете?Просматривая документы localStorage, о которых я знаю, упоминается что-то о Storage конструкторе , но ничего о Store.Так что, возможно, вы захотите это выяснить.

Редактировать # 1: Неважно, Я вижу, вы упомянули, где было определено Store.

0 голосов
/ 11 мая 2013

Я справился с этим, создав метод, который позволяет вам настраивать 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'); 
...