我经常发现自己为stickit
jQuery目标ID
提供了某种命名约定,其形式为some-aggregate-individual-element-{#number}
,每个ID
与一个相应的集合元素配对一对一的时尚。这是为了确保stickit
仅更新相关的特定View
而不更新其他类似的聚合视图。
如果你能以某种方式告诉ID
“root”节点执行更新,似乎应该有一种方法可以使用类名而不是stickit
。例如,如果我定义View
并且我说bindings: { ".individual-title": { observe: "Title" } }
,stickit
知道Title
属性来自this.model
,那么就不需要资格。但是,每当我将相同的逻辑应用于左侧时,stickit
对具有该类名的文档上的所有节点执行更新,而不是仅对this.$el
下的$el
节点执行更新,其中id
}是我视图的根节点。
有没有内置的或其他简单的方法来实现这一点,所以我可以用愚蠢的命名约定来{{1}}我的所有元素?或者这是你应该做的?
答案 0 :(得分:2)
我实际上绑定到表单元素上的name属性,因此不使用id和类名。例如,假设我有以下模型。
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">