2013-05-23 5 views
28

मैं angular.js लेने और कुछ कम दस्तावेजों को समझने पर काम करने की कोशिश कर रहा हूं।

इस पर विचार करें - मेरे पास सर्वर पर एक खोज विधि है जो क्वेरी पैरा को स्वीकार करती है और खोज परिणामों का संग्रह लौटाती है, और GET /search.json मार्ग (रेल FWIW) का जवाब देती है।

तो jQuery साथ, कोई नमूना क्वेरी इस प्रकार दिखाई देगा:

$.getJSON('/search', { q: "javascript", limit: 10 }, function(resp) { 
    // resp is an array of objects: [ { ... }, { ... }, ... ] 
}); 

मैं इस कोणीय का उपयोग कर लागू करने की कोशिश कर रहा हूँ, और यह कैसे काम करता आसपास मेरे सिर लपेटो।

var app = angular.module('searchApp', ['ngResource']); 

app.controller('SearchController', ['$scope', '$resource', function($scope, $resource){ 

    $scope.search = function() { 
    var Search = $resource('/search.json'); 
    Search.query({ q: "javascript", limit: 10 }, function(resp){ 
     // I expected resp be the same as before, i.e 
     // an array of Resource objects: [ { ... }, { ... }, ... ] 
    }); 
    } 
}]); 

और ध्यान में रखते हुए:

<body ng-app="searchApp"> 
    ... 
    <div ng-controller="SearchController"> 
    ... 
    <form ng-submit="search()">...</form> 
    ... 
    </div> 
</body> 

हालांकि, मैं TypeError: Object #<Resource> has no method 'push' और $apply already in progress की तरह हो रही त्रुटियों रखना यह है कि मैं क्या अब है।

var Search = $resource("/search.json?" + $.param({ q: "javascript", limit: 10 })); 
Search.query(function(resp){ ... }); 

इसे और अधिक एक बार $resource प्रारंभ करने और फिर अनुरोध किया खोज में परिवर्तन के साथ अलग क्वेरी पैरामीटर भेजने सहज लगता है:

चीजें बाहर काम करने की उम्मीद के रूप में अगर मैं निम्नलिखित करने के लिए $resource प्रारंभ बदलने लगते हैं। मुझे आश्चर्य है कि क्या मैं इसे गलत कर रहा हूं (सबसे अधिक संभावना है) या सिर्फ उन दस्तावेज़ों को गलत समझाएं जो $resource.query को क्वेरी पैराम्स ऑब्जेक्ट के साथ बुलाते हैं क्योंकि पहला तर्क संभव है। धन्यवाद।

उत्तर

24

TypeError: Object # has no method 'push' and $apply already in progress

क्योंकि आप नाम खोजें के साथ एक संसाधन निर्धारित नहीं किया है। सबसे पहले आपको ऐसे संसाधन को परिभाषित करने की आवश्यकता है। Doc: $resource। यहाँ एक उदाहरण कार्यान्वयन

angular.module('MyService', ['ngResource']) 
     .factory('MyResource', ['$resource', function($resource){ 

    var MyResource = $resource('/api/:action/:query',{ 
     query:'@query' 
    }, { 
     search: { 
      method: 'GET', 
      params: { 
       action: "search", 
       query: '@query' 
      } 
     } 
    }); 
    return MyResource; 
}]); 

एप्लिकेशन को आप में इस मॉड्यूल को शामिल करें और इस

$scope.search_results = MyResource.search({ 
    query: 'foobar' 
}, function(result){}); 

की तरह एक नियंत्रक में इसका इस्तेमाल करते हैं लेकिन मुझे यकीन है कि नहीं कर रहा हूँ अगर यह तुम क्या जरूरत है। संसाधन सेवा रिकस्ट सर्वर-साइड डेटा स्रोत उर्फ ​​रीस्ट एपीआई के साथ इंटरैक्ट करता है।

$http({method: 'GET', url: '/someUrl'}). 
    success(function(data, status, headers, config) { 
    // this callback will be called asynchronously 
    // when the response is available 
    }). 
    error(function(data, status, headers, config) { 
    // called asynchronously if an error occurs 
    // or server returns response with an error status. 
    }); 

http://docs.angularjs.org/api/ng.$http

+0

'की स्थापना करता है वर खोजें = $ संसाधन (...)' पहले से चाल भी नहीं:

हो सकता है कि आप प्राप्त सिर्फ एक सरल http की ज़रूरत है? मुझे लगता है कि मैं अभी भी कोणीय में सेवाओं और कारखानों के विचार को काम कर रहा हूं। इसके अलावा, मेरी पहली कोशिश '$ http' के साथ थी और यह ठीक काम करता था। मैं या तो '$ संसाधन' का प्रयास करना चाहता था, बस इसका उपयोग करने के लिए एक महसूस करने के लिए। धन्यवाद! – sa125

+3

एचएम var खोज = $ संसाधन (...) वास्तव में सही है। हालांकि संसाधन किसी ऑब्जेक्ट को वापस करने की अपेक्षा करता है लेकिन आप एक सरणी लौटाते हैं? सेटिंग आज़माने का प्रयास करें: आपकी क्वेरी विधि पर सत्य, समान समस्या https://groups.google.com/forum/#!topic/angular/MT1vIakNEVM –

+1

आप क्वेरी पैरामीटर को ओवरराइड क्यों करते हैं? – Vincent

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