2012-06-26 26 views
7

我的代碼:Backbone.js的錯誤 - 遺漏的類型錯誤:對象的翻譯:有沒有方法「設置」

我是新來Backbone.js的,並試圖建立與Backbone.js的和PHP應用程序。當我試圖打電話給在路由器add,我得到錯誤:

Uncaught TypeError: Object [object Object] has no method 'set'.

請幫我找到我的錯誤。

謝謝。

// Models 
    window.Users = Backbone.Model.extend({ 
     urlRoot:"./bb-api/users", 
     defaults:{ 
      "id":null, 
      "name":"", 
      "email":"", 
      "designation":"" 
     } 
    }); 

    window.UsersCollection = Backbone.Collection.extend({ 
     model:Users, 
     url:"./bb-api/users" 
    }); 


    // Views 


    window.AddUserView = Backbone.View.extend({ 

     template:_.template($('#new-user-tpl').html()), 

     initialize:function(){ 
      this.model.bind("click", this.render, this); 
     }, 

     render:function(){ 
      $(this.el).html(this.template(this.model.toJSON())); 
      return this; 
     }, 

     events:{ 
      "click .add":"saveUser" 
     }, 

     saveUser:function(){ alert('saveUser'); 
      this.model.set({ 
       name:$("#name").val(), 
       email:$("#email").val(), 
       designation:$("#designation").val() 
      }); 

      if(this.model.isNew()){ 
       this.model.create(this.model); 
      } 
      return false; 
     } 
    }); 


    // Router 
    var AppRouter = Backbone.Router.extend({ 

     routes:{ 
      "":"welcome", 
      "users":"list", 
      "users/:id":"userDetails", 
      "add":"addUser" 
     }, 


     addUser:function(){ 
      this.addUserModel = new UsersCollection(); 
      this.addUserView = new AddUserView({model:this.addUserModel}); 
      $('#content').html(this.addUserView.render().el); 
     } 


    }); 

    var app = new AppRouter(); 
    Backbone.history.start(); 
+4

你傳遞一個集合的視圖,然後試圖把它當作模型的一個實例。不是。這是一個集合。 – asawyer

+1

澄清:'Backbone.Collection'沒有metod'set'。 – jakee

+0

感謝您的幫助 – Nag

回答

1

正如評論所說,這裏的問題從這裏開始:

this.addUserModel = new UsersCollection(); 
this.addUserView = new AddUserView({model:this.addUserModel}); 

,並完成在這裏:

saveUser:function(){ alert('saveUser'); 
    this.model.set({ 

通過傳遞一個集合的地方,你製造混亂的典範,並且因此在saveUser函數中稍後嘗試調用方法(set)在Backbone.Collection實例上。


注:由於1.0.0版本Backbone.Collection現在有一個set方法。在以前的版本中,如問題作者使用的版本,該方法被稱爲update


您可以採取幾個步驟來澄清此代碼。對於初學者,所以很顯然我會重新命名你的模型和集合類,該模型是奇異形式和收集是複數形式:

window.Users =>window.User

window.UsersCollection =>window.Users

接下來,我將創建一個新User模型,而不是Users收集,並傳遞到您的視圖:

this.addUserModel = new User(); 
this.addUserView = new AddUserView({model:this.addUserModel}); 

最後,我想刪除這些行:

if(this.model.isNew()){ 
    this.model.create(this.model); 
} 

一方面,該模型將永遠是新的(因爲你只是路過它之前創建的),但更重要的是你不需要調用Collectioncreate方法,因爲該方法會創建一個新模型,而您已經創建了一個模型。也許你應該添加的是:

this.model.save(); 

如果你的意圖是將模型保存到你的服務器。

因爲您已經爲該模型指定了urlRoot,所以您應該只需創建一個新模型,將其傳遞到視圖,讓視圖根據DOM元素填充其屬性,最後保存該模型的屬性到您的服務器。

0

我認爲你正面臨着對象範圍的問題。當事件觸發時,它將事件對象發送到該函數。剛剛嘗試這一點,可能工作 聲明全局變量與內部當前視圖初始化

initialize : function(){ self = this; } 

那麼這改變自我,

 saveUser:function(){ alert('saveUser'); 
     self.model.set({ 
      name:$("#name").val(), 
      email:$("#email").val(), 
      designation:$("#designation").val() 
     }); 

     if(self.model.isNew()){ 
      self.model.create(this.model); 
     } 
     return false; 
    } 
相關問題