2013-06-25 12 views
8

मैं एक Django बैकएंड मेरे द्वारा बनाए गए रिकॉर्ड को लाने के लिए restangular का उपयोग कर एक AngularJS आधारित दृश्यपटल है।AngularJS/Restangular मार्ग "सेट नहीं कर सकता गुण अपरिभाषित की 'मार्ग'"

मैं निम्नलिखित के साथ एक ग्राहक सूची के लिए एक कॉल बना रही हूँ:

var app; 

app = angular.module("myApp", ["restangular"]).config(function(RestangularProvider) { 
    RestangularProvider.setBaseUrl("http://172.16.91.149:8000/client/v1"); 
    RestangularProvider.setResponseExtractor(function(response, operation) { 
    return response.objects; 
    }); 
    return RestangularProvider.setRequestSuffix("/?callback=abc123"); 
}); 

angular.module("myApp").controller("MainCtrl", function($scope, Restangular) { 
    return $scope.client = Restangular.all("client").getList(); 
}); 

क्रोम पर HTTP 200 के साथ डेटा लौटने बैकएंड दिखा रहा है:

abc123({ 
    "meta": { 
     "limit": 20, 
     "next": "/client/v1/client/?callback=abc123&limit=20&offset=20", 
     "offset": 0, 
     "previous": null, 
     "total_count": 2 
    }, 
    "objects": [{ 
     "id": 1, 
     "name": "Test", 
     "resource_uri": "/client/v1/client/1/" 
    }, { 
     "id": 2, 
     "name": "Test 2", 
     "resource_uri": "/client/v1/client/2/" 
    }] 
}) 

लेकिन वह मैं होता है एक बार क्रोम के कंसोल में निम्नलिखित स्टैक ट्रेस दिखाई दे रहा है:

TypeError: Cannot set property 'route' of undefined 
    at restangularizeBase (http://172.16.91.149:9000/components/restangular/src/restangular.js:395:56) 
    at restangularizeCollection (http://172.16.91.149:9000/components/restangular/src/restangular.js:499:35) 
    at http://172.16.91.149:9000/components/restangular/src/restangular.js:556:44 
    at wrappedCallback (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.js:6846:59) 
    at http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.js:6883:26 
    at Object.Scope.$eval (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.js:8057:28) 
    at Object.Scope.$digest (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.js:7922:25) 
    at Object.Scope.$apply (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.js:8143:24) 
    at done (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.js:9170:20) 
    at completeRequest (http://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.js:9333:7) angular.js:5754 

मैंने ब्रेकपॉइंट किया restangular.js में में लाइन 395 पर:

L394 function restangularizeBase(parent, elem, route) { 
L395  elem[config.restangularFields.route] = route; 

पहली बार यह ब्रेकप्वाइंट elem हिट सिर्फ एक वस्तु है और routeclient का मूल्य है।

दूसरी बार ब्रेकपॉइंट मारा जाता है elem अपरिभाषित है और route का मूल्य client है।

कोई भी विचार क्यों elem के आसपास दूसरी बार अपरिभाषित किया जाएगा?

उत्तर

8

मैं रेस्टैंगुलर का निर्माता हूं।

restangularizeBase समारोह अपने संग्रह के लिए पहली और फिर अपने तत्वों में से प्रत्येक के लिए कहा जाता है।

StackTrace से, तत्व ठीक है, लेकिन एक बार संग्रह restangularizeBase को भेजा जाता है, यह वास्तव में अपरिभाषित है। क्या आप console.log respond.objects को कंसोल.लॉग कर सकते हैं? इसके अलावा, कृपया नवीनतम संस्करण में अपडेट करें।

इसके अलावा, डिफ़ॉल्ट अनुरोध पैरामीटर के लिए, आप requestSuffix के बजाय defaultRequestParams का उपयोग करना चाहिए। requestSuffix केवल अंत "/"

अगर मैं आपको कुछ और मदद कर सकते हैं मुझे जानते हैं के लिए इस्तेमाल किया जाना चाहिए!

19

सूचियों का अनुरोध करते समय, पुनर्विक्रेता सर्वर से डेटा को एक सरल सरणी होने की अपेक्षा करता है। हालांकि, अगर परिणामस्वरूप डेटा परिणाम मेटाडेटा के साथ लपेटा जाता है, जैसे पेजिनेशन जानकारी, यह अलग हो जाती है।

आप Django बाकी फ्रेमवर्क का उपयोग कर रहे हैं, तो यह इस तरह लिपटे परिणाम देंगी:

{ 
    "count": 2, 
    "next": null, 
    "previous": null, 
    "results": [ 
     { 
      "id": 1, 
      "name": "Foo" 
     }, 
     { 
      "id": 2, 
      "name": "Bar" 
     } 
    ] 
} 

इस अनुवाद करने के लिए, आपको कोई जवाब निकालने समारोह बनाना होगा। यह मॉड्यूल config में निर्दिष्ट करने के लिए सबसे आसान है:

angular.module('myApp', ['myApp.controllers', 'restangular']). 
config(function(RestangularProvider) { 
    RestangularProvider.setBaseUrl("/api"); 

    // This function is used to map the JSON data to something Restangular 
    // expects 
    RestangularProvider.setResponseExtractor(function(response, operation, what, url) { 
     if (operation === "getList") { 
      // Use results as the return type, and save the result metadata 
      // in _resultmeta 
      var newResponse = response.results; 
      newResponse._resultmeta = { 
       "count": response.count, 
       "next": response.next, 
       "previous": response.previous 
      }; 
      return newResponse; 
     } 

     return response; 
    }); 
}); 

यह एक साधारण सरणी होने के लिए परिणाम rearranges मेटाडाटा युक्त _resultmeta के एक अतिरिक्त संपत्ति के साथ। पुनर्विक्रेता सरणी के साथ यह काम करेगा, और इसकी ऑब्जेक्ट्स होगी, और आप सरणी को संभालने के दौरान _resultmeta प्रॉपर्टी तक पहुंच सकते हैं जैसा आप उम्मीद करेंगे।

+2

@ mark-l मेरा सुझाव है कि आप इसे उत्तर के रूप में चिह्नित करें। धन्यवाद। –

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