2012-03-22 17 views
6

मैं इस मॉडलbackbone.js

var Item = Backbone.Model.extend({ 
    url: 'http://localhost/InterprisePOS/Product/loaditembycategory/Event Materials' 
}); 

var onSuccess = function(){ alert("success"); }; 

और एक संग्रह

var Items = Backbone.Collection.extend({ 
    model: Item 
}); 

और मेरे कोड के बाकी राशि में मॉडल की विशेषताओं जाओ यहाँ है:

var item = new Item(); 
var items = new Items(); 
item.fetch({ success: onSuccess }); 
alert(items.get("ItemCode")); 

क्या मैं चाहते हैं कि मॉडल के गुणों को आसानी से प्राप्त करें। अब मेरे पास फायरबग पर है। इसके अलावा जब मैं इसे ब्राउज़र पर चलाता हूं तो मुझे चेतावनी सफलता मिलती है और अगली चेतावनी अपरिभाषित है।

{"ErrorMessage":null,"Items":[{"ErrorMessage":null,"CategoryCode":"Event Materials","ClassCode":null,"Components":null,"GroupCode":null,"ImageURL":null,"ItemCode":"ITEM-123","ItemDescription":"Old World Lamppost\u000d\u000a\u000d\u000a","ItemName":"GET123","ItemType":null,"KitItem":null,"Matrix":null,"Prefix":null,"RetailPrice":107.990000,"SalesTaxCode":null,"UPCCode":null,"UnitMeasureCode":"EACH","UnitsInStock":0,"Value":null,"WholesalePrice":95.000000}]} 

नोट

सिर्फ आइटम यह रिटर्न में से एक है कि: enter image description here

यह उत्पादन होता है। मैंने अभी आइटम पर पोस्ट किया है ताकि यह इतना लंबा न हो।

उत्तर

10

आप अपने संग्रह पर get बुला रहे हैं (http://documentcloud.github.com/backbone/#Collection-get देखें)

ऐसा लगता है क्या: तुम क्या करने की कोशिश कर रहे हैं संग्रह Items में एक तत्व और फिर उस तत्व पर item.get("ItemCode") कहते हैं, इस तरह है आप वास्तव में संग्रह पर पुनरावृत्ति करना चाहते हैं, और कॉल प्रत्येक आइटम

items.each(function(item) { 
    item.get('ItemCode'); 
}); 

यदि नहीं, तो कृपया विस्तृत करें!

इसके अतिरिक्त, यदि आपका मॉडल यूआरएल मॉडल की एक सूची के साथ प्रतिक्रिया करता है, तो आपको अपने मॉडल के बजाय अपने संग्रह में यूआरएल विशेषता परिभाषित करनी चाहिए।

var Items = Backbone.Collection.extend({ 
    model: Item, 
    url: 'http://localhost/InterprisePOS/Product/loaditembycategory/Event Materials' 
}); 

और आपकी प्रतिक्रिया सरणी तत्वों [<item1>, <item2>, ...], बजाय {'Items': [<item1>, <item2>, ...] } साथ एक JSON वस्तु के रूप में एक सरणी, आइटम के साथ होना चाहिए। यदि आप प्रतिक्रिया को संशोधित नहीं करना चाहते हैं, तो आपको अपने संग्रह (http://documentcloud.github.com/backbone/#Collection-parse) पर parse फ़ंक्शन लागू करना होगा।

इसके अलावा, जैसा @chiborg का उल्लेख है, आप कह रहे get सही होने के बाद fetch (जो एसिंक्रोनस रूप से पूरा हो जाएगा), तो कोई गारंटी नहीं है कि आपके डेटा उपलब्ध हो जाएगा नहीं है।

संग्रह पर 'रीफ्रेश' श्रोता को बांधने का उचित समाधान यहां उचित समाधान है।

items.on('refresh', function() { 
    // now you have access to the updated collection 
}, items); 
+0

मॉडल भाग के बारे में खेद है। मैं बस इस पर प्रयोग कर रहा हूं क्योंकि मैंने देखा है कि मॉडल आइटम को इसके खाली गुण नहीं मिलते हैं। पार्स चीज के बारे में भी। मैंने कोशिश की लेकिन कोड को निष्पादित करने के बाद यह मॉडल को पुनः प्राप्त नहीं करता है। संग्रह की मॉडल विशेषता खाली है [[] "लेकिन मेरे पास मॉडल है: आइटम – jongbanaag

+0

आपका मॉडल/संग्रह यूआरएल (लोकलहोस्ट/इंटरप्राइज ...) क्या लौटाता है? – jlb

+0

मैंने उपरोक्त कोड जोड़ा। – jongbanaag

2

यह मॉडल लोडिंग के कारण असीमित रूप से है - item.get("ItemCode") मॉडल के बाद fetch के साथ लोड होने के बाद ही काम करेगा। इसे अपने ऑन-फ़ंक्शन फ़ंक्शन में कॉल करने का प्रयास करें।

इसके अतिरिक्त, ध्यान दें कि यह सीधे Item प्रारंभ करने में मदद नहीं करेगा।

function onSuccess() { 
    alert('success') 
    var item = items.get(13); // get item with id 13 
    alert(item.get("ItemCode")); 
} 
+0

मैंने आपके कोड की कोशिश की। लेकिन मैं उस आइटम को बताते हुए एक त्रुटि फेंकता हूं (चेतावनी (item.get())) अपरिभाषित है। – jongbanaag

+0

मुझे खेद है, मैंने AJAX अनुरोध से परिणाम नहीं देखा। बैकबोन का संग्रह वर्ग।जेएस उम्मीद करता है कि एक सरणी वापस लौटाई जाए, न कि ऑब्जेक्ट जहां संग्रह वस्तुओं को घोंसला दिया जाता है। क्या आप सर्वर के पक्ष में जो कुछ भी लौटाए हैं, उसे बदल सकते हैं, "आइटम" के बाद आने वाले सरणी को वापस कर सकते हैं? – chiborg