2012-04-21 19 views
11

पर सभी विशेषताओं को प्रस्तुत नहीं करता है मुझे JSON में मॉडल के गुण प्रस्तुत करने की आवश्यकता है ताकि मैं उन्हें टेम्पलेट में पास कर सकूं।बैकबोन मॉडल .toJSON() JSON

created_at: "2012-04-19" 
id: "29" 
name: "item" 
resource_uri: "/api/v1/item/29/" 
updated_at: "2012-04-21" 
user: "/api/v1/user/9/" 

यहाँ मॉडल के JSON है: console.log कर (this.model) के बाद गुण उत्पादन

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

यहाँ है: यहाँ एक दृश्य के लिए एक प्रस्तुत करना() फ़ंक्शन कैसा दिखाई देता है है console.log (this.model.toJSON()) के बाद आउटपुट:

id: "29" 
__proto__: Object 

क्या हुआ?

संपादित करें:

var goal = new Goal({id: id}); 
    goal.fetch(); 
    var goalFullView = new GoalFullView({ 
    model: goal, 
    }); 

यहाँ नए दृश्य की सामग्री हैं:: यहाँ इन्स्टेन्शियशन है

console.log(this.model.attributes); 
    console.log(this.model.toJSON()); 

यहाँ कंसोल का कहना है:

Object 
created_at: "2012-04-23" 
id: "32" 
name: "test" 
resource_uri: "/api/v1/goal/32/" 
updated_at: "2012-04-23" 
user: "/api/v1/user/9/" 
__proto__: Object 

Object 
id: "32" 
name: "test" 
__proto__: Object 

हैं toJSON को गुणों का एक क्लोन बनाना है, यह सही नाम की प्रतिलिपि क्यों नहीं करता है या यह made_at, update_at फ़ील्ड को कॉपी क्यों नहीं करता है?

संपादित करें 2:

var Goal = Backbone.Model.extend({ 

    // Default attributes for Goal 
    defaults: { 
     name: "empty goal", 
    }, 

    // Check that the user entered a goal 
    validate: function(attrs) { 
     if (!attrs.name) { 
     return "name is blank"; 
     } 
    }, 

    // Do HTTP requests on this endpoint 
    url: function() { 
     if (this.isNew()) { 
     return API_URL + "goal/" + this.get("id") + FORMAT_JSON; 
     } 
     return API_URL + "goal/" + FORMAT_JSON; 
     //API_URL + "goal" + FORMAT_JSON, 
    }, 
    }); 

संपादित करें 3:: मैं पता लगा है कि मैं सफलता कॉलबैक उपयोग करने के लिए लाने से एक दृश्य मॉडल का उपयोग करता है रेंडर करने के लिए की जरूरत है:

यहाँ मॉडल है goal.fetch ({सफलता: फ़ंक्शन (मॉडल) { var goalFullView = नया GoalFullView ({ मॉडल: लक्ष्य, }); }});

+0

आप मॉडल और उसके इन्स्टेन्शियशन रूप में अच्छी तरह दिखा सकते हैं यह हमेशा आशा अनुरूप काम नहीं होगा? – mindandmedia

+0

आपके पास आपके कोड में कुछ और है जो अन्य विशेषताओं को toJSON() के लिए अदृश्य बनाता है, शायद आपके मॉडल या पेस्ट को देखें, आप इसे कैसे प्रारंभ कर रहे हैं ... देखें [jsfiddle] (http://jsfiddle.net/drinchev/ जेएलएफजेबी/1 /) – drinchev

+0

मैंने मूल श्रेणी को मॉडल क्लास के साथ संपादित किया। मुझे लगता है कि toJSON क्यों काम नहीं करता है। हालांकि, यह .model.attributes गुणों की सही सूची को प्रिंट करता है, जब मैं ऐसा करने की कोशिश करता हूं। Model.get ("id") या अन्य किसी भी विशेषता, वे खाली के रूप में आते हैं। जाहिर है, यह तब मौजूद है जब मैं मॉडल उदाहरण पर विशेषताओं को कॉल करता हूं। – egidra

उत्तर

27

toJSON() विधि मॉडल की attributes संपत्ति का उथला क्लोन देता है।

annotated Backbone.js source से:

toJSON: function(options) { 
    return _.clone(this.attributes); 
} 

अपने कोड के अधिक देखकर बिना, यह आप सीधे मॉडल वस्तु पर गुण सेट की तरह है, बल्कि मॉडल गुण सेट करने के लिए set समारोह का उपयोग करने से लग रहा है।

आईई। यह मत करो:

model.name = "item"; 

ऐसा करते हैं:

model.set("name", "item"); 

संपादित करें:

अपने विशिष्ट समस्या के लिए, यह है कि आप toJSON कहा जाता है से पहले मॉडल सर्वर से समाप्त लोड हो रहा है था संभव है।

उदा।

var model = new Goal({id: 123}); 
model.fetch(); 
console.log(model.toJSON()); 

लेकिन यह होगा:

var model = new Goal({id: 123}); 
model.fetch({ 
    success: function() { 
    console.log(model.toJSON()); 
    } 
}); 
+1

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

+3

वैकल्पिक सेट वाक्यविन्यास: 'model.set ({name:" item "}) '- यह फ़ॉर्म आपको कई गुणों को एक साथ सेट करने देता है। – stusmith

संबंधित मुद्दे