2012-01-17 66 views
1

我有一個模型,我使用api保存到數據庫。我的問題是更新這個模型。我第一次改變任何東西並調用model.save時,這些屬性作爲JSON傳遞給api,解析並保存它,沒有問題。現在,第二次在同一視圖中對該模型進行更改時,model.save將未定義的對象添加到我的模型中。 api看到這個對象並拒絕PUT請求。Backbone.js model.save()問題與RESTful api

爲什麼它能在第一次更新時使用,而不是第二次使用?

感謝您的幫助。

這是代碼,我希望你能理解它。

var LDAccount = Backbone.Model.extend({ 
    defaults : { 
     ACC_NUM : '', 
     BOOK_DATE : '', 
     F_NAME : '' 
    }, 
    template : _.template(
     "<p>Full Name</p><input data-id='F_NAME' type=text value='<%= F_NAME %>' />" + 
     "<p>Book Date</p><input data-id='BOOK_DATE' type=text value='<%= BOOK_DATE %>' />" 
    ), 
    urlRoot : 'api/account' 
}); 

var LDAccountView = Backbone.View.extend({ 
    el : '', // set this when instantiating this model in the router 
    initialize : function(options) { 
     this.model = options.model; 
     this.model.id = options.id; 
     this.model.bind('change', this.render, this); 
     this.model.bind('error', this.renderError, this); 
    }, 
    render : function() { 
     $(this.el).html(this.model.template(this.model.toJSON())); 
     $(this.el).append(
      '<div id="model_buttons" >' + 
      '<input type=button id=reset value=Reset />' + 
      '<input type=button id=save value=Save />' + 
      '</div>' 
     ); 
     return this; 
    }, 
    events : { 
     'click #save' : 'save2db' 
    }, 
    save2db : function() { 
     var $fields = $(this.el).find('input[type=text]'); 
     var modObj = new Object(); 
     $fields.each(function() { 
      var $field = $(this); 
      var prop = $field.attr('data-id'); 
      var val = $field.val(); 
      modObj[prop] = val; 
     }); 
     this.model.set(modObj); 
     console.log(modObj); 
     this.model.save({ 
      success : function() { 
       self.reset(); 
      } 
     }); 
     return false; 
    }, 
    renderError : function() { 
     $(this.el).append('<p class=error>Account does not exist</p>'); 
    }, 
    reset : function() { 
    } 
}); 

var MainView = Backbone.View.extend({ 
    // code omitted since it's not relevant to the question 
}); 

var LDRouter = Backbone.Router.extend({ 
    routes : { 
     "account/:modl/:acc_num": "renderView" 
    }, 

    initialize : function() { 
     this.search = new MainView({ el : '#main'}); 
    }, 

    // THIS IS THE VIEW THAT RENDERS THE MODEL 
    renderView : function(modl, acc_num) { 
     var self = this; 
     var model = null; 

     switch(modl) { 
      case 'account': 
       model = new LDAccount(); 
       break; 
      // these other models were omitted for clarity 
      case 'asset': 
       model = new LDAsset(); 
       break; 
      case 'info': 
       model = new LDInfo(); 
       break; 
      default: 
       model = new LDAccount(); 
       break; 
     } 

     this.account = new LDAccountView({ id : acc_num, el : '#accDetail', model : model }); 
     this.account.reset = function() { 
      self.renderView(modl,acc_num); 
     }; 
     this.account.model.fetch(); 
    }, 

    accountInfo : function (acc_num) { 
     var root = ''; 
     var url = window.location.href; 
     var hashPos = url.indexOf('#'); 
     if(hashPos != -1) { 
      root = url.substr(0,hashPos); 
     } else { 
      root = url; 
     } 
     window.location = root + "#account/account/" + acc_num; 
    } 

}); 

$(function() { 
    var app = new LDRouter(); 
    Backbone.history.start(); 
}); 
+0

添加一些示例代碼以提供關於您正在做的事情的額外信息真的有幫助。 – ryanmarc 2012-01-17 05:44:27

+0

請添加模型的代碼以及如何保存它。 – 2012-01-17 06:51:46

回答

1

好, 所有參數傳遞給model.save似乎工作。 在其他世界,

this.model.save(
    { 
     success: function() { 
      // do some stuff here 
     }, 
     error: function() { 
      // do other stuff here 
     } 
    } 
); 

解決我遇到的問題。 我仍然想知道爲什麼save會傳入一個添加到模型屬性中的未定義對象。

+3

仍然奇怪,這將工作,因爲api說,第一個參數是你想改變你的模型的屬性的散列,第二個參數是回調。因此'.save({},{success:function})'應該按照您的預期來做。 http://documentcloud.github.com/backbone/#Model-save – 2012-01-17 20:37:00

+0

安德烈亞斯是對的。第一個參數可以代替'this.model.set('someProperty','someValue')'代碼。如果你已經設置了你的模型屬性(就像OP那樣),你可以簡單地傳入一個空的對象,就像Andreas上面所說的那樣。 – 2013-02-06 18:29:08

0

那是因爲你忘記初始化變量,它存儲POST數據部分,例如''。所以當數據作爲字符串附加到變量時,它會附加到'undefined'。解決方法:問題出在您的服務器上!