2011-12-13 63 views
0

在将表单中的值发送到数据库之前,是否有更好的方式来更新模型?我愿做这样的事情:在将骨干模型发送到数据库之前是否有更好的方法来更新骨干模型?

mySave: function() { 
     this.model.save($(this.el).find(':input').serializeArray()); 
    }, 

的问题是,.serializeArray()返回一个数组[{key1:"val1"}, {key2:"val2"}]和Backbone.js的model.save()期待的对象{"key1":"val1", "key2":"val2"}作为PARAM。

后端是asp.net MVC。我提到这一点,以防万一有更好的方法将这些信息传回服务器。

目前,我只是遍历序列化数组,并逐个设置骨干模型的每个属性。

回答

2

只是写道:https://github.com/macek/jquery-to-json

看到它的演示在这里工作http://macek.github.com/jquery-to-json

(function($){ 
    $.fn.toJSON = function(options){ 

     options = $.extend({}, options); 

     var self = this, 
      json = {}, 
      push_counters = {}, 
      patterns = { 
       "validate": /^[a-zA-Z][a-zA-Z0-9_]*(?:\[(?:\d*|[a-zA-Z0-9_]+)\])*$/, 
       "key":  /[a-zA-Z0-9_]+|(?=\[\])/g, 
       "push":  /^$/, 
       "fixed": /^\d+$/, 
       "named": /^[a-zA-Z0-9_]+$/ 
      }; 


     this.build = function(base, key, value){ 
      base[key] = value; 
      return base; 
     }; 

     this.push_counter = function(key, i){ 
      if(push_counters[key] === undefined){ 
       push_counters[key] = 0; 
      } 
      if(i === undefined){ 
       return push_counters[key]++; 
      } 
      else if(i !== undefined && i > push_counters[key]){ 
       return push_counters[key] = ++i; 
      } 
     }; 

     $.each($(this).serializeArray(), function(){ 

      // skip invalid keys 
      if(!patterns.validate.test(this.name)){ 
       return; 
      } 

      var k, 
       keys = this.name.match(patterns.key), 
       merge = this.value, 
       reverse_key = this.name; 

      while((k = keys.pop()) !== undefined){ 

       // adjust reverse_key 
       reverse_key = reverse_key.replace(new RegExp("\\[" + k + "\\]$"), ''); 

       // push 
       if(k.match(patterns.push)){ 
        merge = self.build([], self.push_counter(reverse_key), merge); 
       } 

       // fixed 
       else if(k.match(patterns.fixed)){ 
        self.push_counter(reverse_key, k); 
        merge = self.build([], k, merge); 
       } 

       // named 
       else if(k.match(patterns.named)){ 
        merge = self.build({}, k, merge); 
       } 
      } 

      json = $.extend(true, json, merge); 
     }); 

     return json; 
    }; 
})(jQuery); 
+0

不错。我希望有一些默认的js,jQuery,骨干或下划线方法来处理这个函数;但它看起来像一个需要制定的定制的。 – rkw

0

如果源是一个对象数组,你可以使用json2(现在大部分现代浏览器inherint):

var coll = $(this.el).find(':input'); 
JSON.stringify(coll); 

从json2.js:

text = JSON.stringify(['e', {pluribus: 'unum'}]); 
// text = '["e",{"pluribus":"unum"}]' 
+0

我更新了我的问题,澄清更多;不知道这是否会改变你的答案。我正在使用backbone.js并使用它们的内置模型(REST)将数据保存到数据库中。我能否将这个值'text'与Model.save()方法一起使用保存我的数据? – rkw

+0

不完全熟悉'backbone'的REST模型,但是如果它想要像这样的'{“key1”:“val1”,“key2”:“val2”}',那是一个JSON对象,所以它应该能够接受任何有效的JSON(这是我上面发布的)。 – Terry

1

它不是默认的JavaScript,但德里克·贝利没有创造骨干modelbinding插件, 如果一个文本字段更新这使你的模型/视图同步 , https://github.com/derickbailey/backbone.modelbinding

现在你不需要通过任何:如果一个模型属性被更改,将更新的观点在这里就可以了

更多信息,它会更新你的模型属性 在保存中的东西,你的模型是最新的,只是打电话

model.save(); 
+0

谢谢,这看起来非常有用。 – rkw