Backbone stickit - привязка с использованием имен классов и квалифицированного "this"
Я часто предоставляю какое-то соглашение об именах для stickit
цель jQuery ID
с, в форме some-aggregate-individual-element-{#number}
спаривание каждого ID
с соответствующим элементом коллекции один на один. Это для того, чтобы stickit
будет обновлять только частное View
речь, а не другие аналогичные совокупные представления.
Кажется, должен быть способ использовать, скажем, имена классов, а не ID
с этой целью, если бы вы могли как-то сказать stickit
"корневой" узел для выполнения обновлений. Например, если я определяю View
и я говорю bindings: { ".individual-title": { observe: "Title" } }
, stickit
знает, что Title
атрибут исходит от this.model
поэтому нет необходимости в квалификации. Однако всякий раз, когда я применяю ту же логику к левой стороне, stickit
выполняет обновления для ВСЕХ узлов документа с этим именем класса, а не только для тех узлов, которые находятся под this.$el
, где $el
это корневой узел моего взгляда.
Есть ли встроенный или простой способ добиться этого, чтобы я мог остановить id
все мои элементы с глупыми соглашениями об именах? Или это то, что вы должны делать?
1 ответ
На самом деле я связываю атрибут name с элементом формы, поэтому исключаю использование идентификаторов и имен классов. Например, скажем, у меня есть следующая модель.
User.Model = Backbone.Model.extend({
defaults: {
firstname: null,
lastname: null,
phone: null,
personemail: null
}
});
Затем я создаю следующих помощников:
// Create default binding therefore eliminating repetition
Backbone.View.prototype.createDefaultBindings = function() {
var k, v, _ref, _results;
this._bindings = {};
_ref = this.model.toJSON();
_results = [];
for (k in _ref) {
v = _ref[k];
_results.push(this._bindings['input[name="' + k +'"]'] = { observe: k });
}
return _results;
};
// Helper to overide bindings in our view
Backbone.View.prototype.mergeBindings = function() {
if (this.model) {
this.createDefaultBindings();
}
_.extend(this._bindings, this.bindings);
this.bindings = this._bindings;
};
Тогда мы можем иметь следующий вид:
User.Views.Form = Backbone.View.extend({
initialize: function(options) {
this.mergeBindings();
},
render: function() {
this.stickit();
}
});
Инициализировать наш взгляд
var view = new User.Views.Form({ model: new User.Model() })
Затем он будет привязан к вашему шаблону с помощью следующих входных данных:
<input name="firstname" type="text">
<input name="lastname" type="text">
<input name="phone" type="text">
<input name="email" type="text">