2011-12-13 64 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