2013-02-21 108 views
5

मैं दो वेब सेवाओं है संयोजन AngularJSवेब सेवा प्रतिक्रियाओं

[ 
    { 
     "id": "1", 
     "headline": "some text", 
     "body": "some text", 
     "authorId": "2" 
    }, 
    { 
     "id": "2", 
     "headline": "some text", 
     "body": "some text", 
     "authorId": "1" 
    } 
] 

और एक दूसरे को देता है एक इस तरह "लेखक", एक आईडी दिया:

{ 
    "id": "1", 
    "name": "Test Name", 
    "email": "[email protected]", 
    "photo": "path/to/img" 
} 

मैं दोनों को गठबंधन करना चाहता हूं, इसलिए मैं एक लेख अवलोकन सूची में लेखकों का नाम और फोटो प्रदर्शित कर सकता हूं।

इस तरह

:

[ 
    { 
     "id": "1", 
     "headline": "some text", 
     "body": "some text", 
     "authorId": "2", 
     "author_info": { 
      "id": "2", 
      "name": "Another Test Name", 
      "email": "[email protected]", 
      "photo": "path/to/img" 
     } 
    }, 
    { 
     "id": "2", 
     "headline": "some text", 
     "body": "some text", 
     "authorId": "1" 
     "author_info": { 
      "id": "1", 
      "name": "Test Name", 
      "email": "[email protected]", 
      "photo": "path/to/img" 
     } 
    } 
] 

मैं एक "लेख" सेवा है कि सेवा लौटने से पहले लेख को हासिल करेगा, लेकिन क्या इसी तरह की "लेखक" से लेखक की जानकारी के साथ वापस आ JSON समृद्ध बनाने के लिए सबसे अच्छा तरीका है है "लेख" सेवा आउटपुट?

factory('Authors', ['$http', function($http){ 
    var Authors = { 

     data: {}, 

     get: function(id){ 
      return $http.get('/api/authors/' + id + '.json') 
       .success(function(data) { 
        Authors.data = data; 
       }) 
       .error(function() { 
        return {}; 
       }); 
     } 
    }; 

    return Authors; 
}]). 

factory('Articles', ['$http', 'Authors', function($http, Authors){ 
    var Articles = { 

     data: {}, 

     query: function(){ 
      return $http.get('/api/articles.json') 
       .success(function(result) { 
        Articles.data = result; // How to get the author info into this JSON object??? 
       }) 
       .error(function() { 
        Articles.data = []; 
       }); 
     } 
    }; 
    return Articles; 
}]) 

कृपया मुझे यह भी बताएं कि यह एक पूरी तरह से गलत दृष्टिकोण है या नहीं। :)

उत्तर

0

एक विकल्प सर्वर पर इस डेटा को गठबंधन करना है, शायद एक अलग जेसन फ़ाइल बनाना। यह क्लाइंट-साइड को सरल बना देगा और दो के बजाय केवल एक HTTP अनुरोध की आवश्यकता होगी।

यदि आप दोनों सेवाएं (जो एक बुरा दृष्टिकोण नहीं है) रखते हैं तो आप एक को आग लग सकते हैं, जवाब की प्रतीक्षा कर सकते हैं और दूसरे को आग लगा सकते हैं। हो सकता है कि ऐसा Articles पहले और उसके बाद Authors:

Articles.get(function (articles) {     
      $scope.articles = articles; 
      //fire query for Authors 
      Authors.query(function (authors) { 
       $scope.authors= authors; 
       //combine both articles and authors 
       combineData(articles, authors);      
      }) 
}); 

यहाँ समारोह है कि डेटा को जोड़ती है:

function combineData(articles, authors){ 
    $.each(articles, function (i, article) { 
     //find author 
     var author = $.grep(authors, function(a, j){ 
        return a.id == article.authorId; 
        }); 
     //set article's author 
     article.author_info = author; 
    }); 
} 

सूचना है कि इस विन्यास के साथ अपने लेख ($scope.articles की स्थापना करके) प्रस्तुत करना होगा भी Authors.query

+0

सलाह के लिए धन्यवाद, लेकिन यह, सही हर लेख पर सभी लेखकों को लाते समय का मतलब होगा? यह बहुत अधिक यातायात है। –

+0

नहीं, कोड मानता है कि आप सभी लेख प्राप्त कर सकते हैं और पूरा होने पर आप सभी लेखकों को लाएंगे। फिर परिणामों को गठबंधन करें। केवल दो अनुरोध शामिल हैं – Ulises

+0

@ JakobLøkkeMadsen क्या आप इसे समझते हैं? – Ulises

6

पर कॉल करने से पहले एपीआई के साथ संवाद करते समय, मैं आपके सेक्टर को संरक्षित करने के लिए निम्नलिखित दृष्टिकोण की अनुशंसा करता हूं (advised by Misko Hevery के रूप में) rvices:

// Author model/service 
    angular.module('myApp').factory('Author', function($http) { 
     var Author = function(data) { 
     angular.extend(this, data); 
     }; 

     Author.get = function(id) { 
     return $http.get('/authors/' + id).then(function(response) { 
      return new Author(response.data); 
     }); 
     }; 

     return Author; 
    }); 

    // Article model/service 
    angular.module('myApp').factory('Article', function($http) { 
     var Article = function(data) { 
     angular.extend(this, data); 
     }; 

     Article.query = function() { 
     return $http.get('/articles/').then(function(response) { 
      var articles = []; 
      angular.forEach(response.data, function(data){ 
      articles.push(new Article(data)); 
      }); 
      return articles; 
     }); 
     }; 

     return Article; 
    }); 

    // Your controller 
    angular.module('myApp') 
     .controller('Ctrl' 
     ,[ 
      '$scope' 
      ,'Article' 
      ,'Author' 
      ,function($scope, Article, Author){ 
      Article.query() 
       .then(function(articles){ 
       $scope.articles = articles; 
       attachAuthors(articles); 
       }); 

      function attachAuthors(articles){ 
       angular.forEach(articles, function(article){ 
       Author.get(article.authorId) 
        .then(function(author){ 
        article.author = author; 
        }); 
       }); 
      } 

      } 
     ] 
    ); 

लेकिन यकीन है कि के लिए, मैं भी अलग कॉल में सभी इस डेटा प्राप्त करने में के खिलाफ सलाह देंगे। इसके बजाय, यदि संभव हो, तो आपको अपना एपीआई संयुक्त संयुक्त JSON वापस कर देना चाहिए। सर्वर-साइड संयोजन कई गुना तेजी से होगा।

+1

सलाह के लिए धन्यवाद + मिस्को के जवाब का लिंक। बहुत सूचनाप्रद। –

2

जेएसओजी देखें। यह इस तरह की चीजें करने के लिए एकदम सही है। जावा, पायथन, जावास्क्रिप्ट और रूबी के लिए वर्तमान में सर्वर कार्यान्वयन हैं। क्लाइंट जावास्क्रिप्ट पक्ष पर, आप बस JSOG.decode (ऑब्जेक्ट) को कॉल करें। मैं इसे कोणीय के साथ भारी मात्रा में उपयोग करता हूं।

https://github.com/jsog/jsog

+0

हे @ जोन-स्टीवंस, आपने कहा कि आप एंगुलरजेएस के साथ भारी मात्रा में जेएसओजी का उपयोग करते हैं, क्या आप कह सकते हैं कि आप यह कैसे करते हैं? –

+1

@JayrMotta पूछने के लिए धन्यवाद! यह बहुत आसान है, आप बस डीकोडेड = JSOG.decode (डेटा) ', जहां आपके डेटा अनुरोध से' डेटा' शरीर प्रतिक्रिया है। कोणीय के मामले में, मैं इसे $ .success() '$ http के लिए या एक इंटरसेप्टर के भीतर वादा करता हूं। –

+0

मैं क्रम में विश्व स्तर पर काम करने के लिए ऐसा किया पहले json पाठ derialized गया था: '' 'जावास्क्रिप्ट $ httpProvider.defaults.transformResponse.splice (0, 0, समारोह (डेटा, headersGetter) { अगर (डेटा && headersGetter () ['सामग्री-प्रकार'] === 'एप्लिकेशन/जेसन') { वापसी JSOG.parse (डेटा); } अन्य { वापसी डेटा; } }); '' आपको क्या लगता है? –

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

  • कोई संबंधित समस्या नहीं^_^