#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. На самом деле, это было бы еще чище! Коллекция является частью основного представления, поэтому ее можно безопасно создать там. Соответствующим образом изменив приведенный выше сценарий.