2015-03-27 7 views
13

मैं सेवा से कुछ डेटा प्राप्त करने के लिए यूई-राउटर समाधान का उपयोग कर रहा हूं।

बात यह है कि सेवा को कॉल करने के लिए मुझे कॉल करने के लिए मुझे मूल $ दायरे से मूल्य प्राप्त करने की आवश्यकता है।

resolve: { 
       contactService: 'contactService', 
       contacts: function ($scope, contactService) { 
        return contactService.getContacts($scope.parentCtrl.parentObjectId); 
       } 
      } 

मैं हो रही Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!

इसके अलावा इस तरह के रूप में नहीं सफलता के साथ bellow दिखाया संकल्प वस्तु के लिए गुंजाइश जोड़ने के रूप में कुछ हताश प्रयास करने की कोशिश की रखने के लिए।

scope: $scope 

कोई विचार?

+0

क्या आप अपना कोड plnkr में पोस्ट कर सकते हैं? – user3722785

+0

मुझे नहीं लगता कि मेरे प्रश्न को और स्पष्टीकरण कोड की आवश्यकता है, मैं बस अपने यूई-राउटर के संकल्प में $ स्कोप जोड़ना चाहता हूं। –

+0

जो आप करने की कोशिश कर रहे हैं वह संभव नहीं है। यदि आपको हल करने के फ़ंक्शन में गणना करने के लिए उपलब्ध होने की आवश्यकता है, तो उसे किसी सेवा से आना होगा। – Claies

उत्तर

19

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

यदि आपको अगले राज्य में एक चर पारित करने की आवश्यकता है तो आप $stateParams ऑब्जेक्ट का उपयोग कर ऐसा कर सकते हैं जो समाधान में उपयोग के लिए उपलब्ध है। आप जब राज्यों को बदलने इसे करने के लिए डेटा जोड़ सकते हैं, जैसे:

अपने टेम्पलेट में, यदि आप अपने दायरे में एक objectId है:

<a ui-sref="statename({'id': objectId})">Change states</a> 

या अपने नियंत्रक में:

$scope.go('statename', {'id': $scope.objectId}); 

आप कर सकते हैं

resolve: { 
    contactService: 'contactService', 
    contacts: function ($stateParams, contactService) { 
     return contactService.getContacts($stateParams.id); 
    } 
} 
+0

बिल्कुल, लेकिन पहले से ही तत्काल स्कोप और नियंत्रक हैं। उदाहरण के लिए मेरे पास क्लाइंट की आईडी नहीं है तो मुझे क्लाइंट के डेटा को कैसे हल करना चाहिए? –

+0

आपको इसे अगले राज्य में पैरामीटर के रूप में पास करना चाहिए, उदाहरण के लिए: '$ state.go ('name'। {Id: 1})' या 'ui-sref =" name ({id: 1}) "' और उसके बाद इसे फिर से प्राप्त करने के लिए अपने संकल्प में '$ राज्य पैराम्स' इंजेक्ट करें और – iH8

+0

के आधार पर डेटा प्राप्त करें अब हम कहीं और मिल रहे हैं, उत्तर के लिए धन्यवाद। –

0

एक alternativ के रूप में: फिर अपने संकल्प में $stateParams का उपयोग करके पुनः प्राप्त है कि ई स्वीकार्य समाधान के लिए, जिसके लिए एक ही संसाधन के लिए सर्वर के लिए एक और दौर यात्रा की आवश्यकता होती है (यदि आपको सर्वर/एपीआई से मूल्य मिल रहा है) तो आप बच्चे नियंत्रक से $watch माता-पिता कर सकते हैं।

function ParentController($http) { 
    var vm = this; 
    $http.get(someResourceUrl).then(function(res) { 
    vm.someResource = res.data; 
    }); 
} 

function ChildController($scope) { 
    // wait untill the parent gets the value 
    var unwatch = $scope.$watch('parent.someResource', function(newValue) { 
    if (newValue) { 
     // the parent has the value, init this controller 
     init(newValue); 
     // dispose of the watcher we no longer need 
     unwatch(); 
    } 
    }); 
    function init(someResource) { 
    // ... do something 
    } 
} 

function routerConfig($stateProvider) { 
    $stateProvider 
    .state('parent', { 
     url: '/parent', 
     controller: 'ParentController', 
     controllerAs: 'parent', 
     templateUrl: '...', 
    }) 
    .state('parent.child', { 
     url: '/child', 
     controller: 'ChildController', 
     controllerAs: 'child', 
     templateUrl: '...', 
    }); 
} 
संबंधित मुद्दे