Как получить доступ к свойствам экземпляра виджета jQuery внутри Backbone.js занятия?

#jquery #jquery-ui #backbone.js

#jquery #jquery-пользовательский интерфейс #backbone.js

Вопрос:

Я работаю над виджетом jQuery, который внутренне использует Backbone.js .
Здесь коллекция создает модели, представление создает свои собственные подвиды:

 Serializer = function(options, element){
  this.element = element;
  this.data = options.data;
  this.collection = new Serialize.Collection(this.data);
  this.view = new Serialize.View({ el: this.element, collection: this.collection });   
};

$.widget.bridge("serialize", Serializer);
  

$.widget.bridge предоставляет удобную оболочку для создания экземпляров виджета и передачи параметров (здесь @vars они задаются Rails):

 $('#item').serialize({
   data: <%= @data %>,
   name: '<%= @name %>',
   keys: '<%= @keys %>'
 });
  

Модели и представления, созданные позже, нуждаются в доступе к параметрам экземпляра виджета. Я решил это до сих пор, установив параметры в самой коллекции:

 this.collection = new Serialize.Collection(this.data, options);
  

И ссылаться на них позже, когда они необходимы (например, в представлении):

 var keys = this.model.collection.keys
  

Но это становится беспорядочным и не таким гибким.

Для одного экземпляра вы можете установить Serialize.Config = { // options } и получить к нему глобальный доступ. Но для нескольких экземпляров каждому экземпляру требуется своя конфигурация.

Итак, мой вопрос в том, есть ли простой способ получить доступ к экземпляру виджета и его параметрам в базовых классах, не передавая его в качестве аргумента?

Ответ №1:

Кажется, что вы хотели бы отображать каждый экземпляр виджета на основе параметров, которые вы передаете виджетам.

Backbone.js Представления по соглашению являются хорошим местом для хранения этих параметров. Тем более, что у вас есть одно представление для каждого виджета.

Таким образом, я бы сделал следующее:

 Serializer = function(options, element){
  // add DOM node and collection to the options hash
  options.el = element;

  // create view and pass options
  this.view = new Serialize.View(options);   
};
  

Когда вы визуализируете виджет (предположительно с this.view.render() помощью), у вас есть доступ ко всем параметрам, которые вы передали в Serializer :

 Serialize.View = Backbone.View.extend({
    initialize: function() {
        // create collection
        this.collection = new Serialize.Collection(this.options.data);

        // register events if needed
        this.collection.bind('add', this.render_one_element_of_the_collection);
        this.collection.bind('fetch', this.render_whole_collection);
    },

    render: function() {
        var data = this.options.data;
        var keys = this.options.keys;
        // etc

        // do something with your variables

        return this;
    }
});
  

Комментарии:

1. Спасибо, это кажется хорошим подходом. Мне нравится идея одного основного представления, соответствующего экземпляру виджета, который инициализирует все. Я бы, вероятно, также переместил создание коллекции внутри основного представления, подумал, что это начинает казаться немного «началом» 🙂

2. На самом деле, это было бы еще чище! Коллекция является частью основного представления, поэтому ее можно безопасно создать там. Соответствующим образом изменив приведенный выше сценарий.