2012-06-26 18 views
7

मेरे कोड:Backbone.js त्रुटि - Uncaught TypeError: ऑब्जेक्ट [वस्तु वस्तु] कोई विधि 'सेट' है

मैं 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' में मेटोड' सेट' नहीं है। – jakee

+0

आपकी मदद के लिए धन्यवाद – Nag

उत्तर

1

टिप्पणी में सुझाव के रूप में, समस्या यहाँ यहाँ शुरू होता है:

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

और यहाँ खत्म:

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

एक मॉडल आप भ्रम की स्थिति पैदा के स्थान पर एक संग्रह में उत्तीर्ण होकर, और इसके परिणामस्वरूप saveUser फ़ंक्शन में आप Backbone.Collection उदाहरण पर Backbone.Model विधि (set) पर कॉल करने का प्रयास करते हैं।


नोट: संस्करण के रूप में 1.0.0 Backbone.Collection अब एक set विधि है। पिछले संस्करणों में, जैसे कि प्रश्न के लेखक द्वारा उपयोग किए जाने वाले, उस विधि को update कहा जाता था।


इस कोड को स्पष्ट करने के लिए आप कई कदम उठा सकते हैं। शुरुआत के लिए, मैं अपने मॉडल और संग्रह वर्गों इतना है कि यह स्पष्ट है नाम बदलने होता है कि मॉडल विलक्षण रूप है और संग्रह बहुवचन रूप है:

window.Users =>window.User

window.UsersCollection =>window.Users

इसके बाद, मैं एक नया User मॉडल बनाने के हैं, एक Users संग्रह के बजाय, और अपने को देखने के लिए कि पारित:

एक बात के लिए

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

, मॉडल हमेशा नए हो जाएगा (जैसा कि आप इसे में पार करने से पहले बनाया हो), लेकिन अधिक महत्वपूर्ण क्या तुम नहीं:

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

अंत में, मैं इन पंक्तियों को दूर करता हूँ Collection की create विधि को कॉल करने की आवश्यकता है क्योंकि यह विधि एक नया मॉडल बनाती है, जब आपके पास पहले से ही एक बनाया गया हो। शायद इसके बजाय आपको क्या जोड़ना चाहिए:

this.model.save(); 

यदि आपका इरादा मॉडल को आपके सर्वर पर सहेजना है।

चूंकि आपने मॉडल के लिए पहले से ही urlRoot निर्दिष्ट किया है, इसलिए आपको एक नया मॉडल बनाने की ज़रूरत है, इसे अपने दृश्य में पास करें, अपना विचार डीओएम तत्वों के आधार पर अपने गुणों को भरें, और आखिरकार उस मॉडल के गुणों को सहेजें आपके सर्वर पर

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; 
    } 
संबंधित मुद्दे