我可以将表单输入绑定到Backbone.js中的模型而无需手动跟踪模糊事件吗?

Jul*_*ien 62 html javascript jquery backbone.js

我有一个backbone.js应用程序(www.github.com/juggy/job-board),我希望将表单输入直接绑定到我的模型(la Sproutcore).

是否可以使用Backbone.js(或其他工具)而无需实际跟踪输入上的每个模糊事件并手动更新模型?这似乎是很多胶水代码.

谢谢,
朱利安

小智 53

如果您的模型中包含许多属性,则可以使用更好的方法来处理此问题.

SampleView = Backbone.View.extend({
    el: "#formEl",

    events: {
        "change input": "changed",
        "change select": "changed"
    },

    initialize: function () {
        _.bindAll(this, "changed");
    },

    changed:function (evt) {
       var changed = evt.currentTarget;
       var value = $(evt.currentTarget).val();
       var obj = {};
       obj[changed.id] = value;
       this.model.set(obj);
    }
 });
Run Code Online (Sandbox Code Playgroud)

依赖于您的输入元素,其id与模型中属性的名称相同.


cly*_*yfe 34

我不确定SC是如何做到的,但可能他们也在听事件.

window.SomeView = Backbone.View.extend({
  events: {
    "change input.content":  "contentChanged"
  },
  initialize: function() {
    _.bindAll(this, 'contentChanged');
    this.inputContent = this.$('input.content');
  },
  contentChanged: function(e) {
    var input = this.inputContent;

    // if you use local storage save 
    this.model.save({content: input.val()});

    // if you send request to server is prob. good idea to set the var and save at the end, in a blur event or in some sync. maintenance timer.
    // this.model.set({content: input.val()});
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 1.也可以尝试模糊事件.2.我一直在思考这个问题,让"绑定"数组类似于"事件"哈希,指定视图部分和具有sync-type参数的模型属性之间的更新(at_change,at_blur等)会很有用. .类似于`bindings:[["div#title","model.title","change","< - "],["input#description","model.description","change","< - >"]]`或类似的东西,应该很容易实现. (2认同)

LoG*_*LoG 18

我认为这是一种从输入元素创建对象的更清晰(也许更快)的方法

changed: function(evt) {
  var target = $(evt.currentTarget),
      data = {};
  data[target.attr('name')] = target.val();
  this.model.set(data);
},
Run Code Online (Sandbox Code Playgroud)

没有jquery:

changed: function(evt) {
  var target = evt.currentTarget,
      data = {};
  data[target.name] = target.value;
  this.model.set(data);
},
Run Code Online (Sandbox Code Playgroud)

  • 您不需要将对象传递给model.set().换句话说,您可以使用以下命令:this.model.set(target.name,target.value); (2认同)

小智 12

你试过Backbone.ModelBinder吗?这是一个很好的工具来做你需要的:https://github.com/theironcook/Backbone.ModelBinder