Backbone stickit - 使用类名绑定并限定“this”

时间:2014-08-05 06:56:05

标签: jquery backbone.js backbone-stickit

我经常发现自己为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}}我的所有元素?或者这是你应该做的?

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">