कोणीयज, मार्गों के बीच की गुंजाइश


87

मेरे पास एक फॉर्म के साथ एक स्थिति है जो कई पृष्ठों पर फैला है (आदर्श नहीं हो सकता है, लेकिन यह है कि यह कैसा है)। मैं पूरे फॉर्म के लिए एक गुंजाइश रखना चाहता हूं जो आपके साथ जाते ही भर जाता है, ताकि यदि उपयोगकर्ता कदमों के बीच आगे-पीछे हो जाए तो राज्य को याद रखना आसान हो जाता है।

इसलिए मुझे बहुत छद्म कोड में करने की आवश्यकता है:

  1. सेट $scope.val = <Some dynamic data>
  2. एक लिंक पर क्लिक करें और एक नए टेम्पलेट (शायद उसी नियंत्रक के साथ) में रूट किया जाए।
  3. $scope.val यह अभी भी वैसा ही होना चाहिए जैसा कि पिछले पृष्ठ पर था।

क्या किसी तरह से इस बारे में जाने के लिए गुंजाइश का डेटा सही तरीका है, या कोई और तरीका है? क्या आप किसी ऐसे नियंत्रक को भी बना सकते हैं, जिसके पास मार्ग के बीच एक स्थायी गुंजाइश है, सिवाय इसके कि इसे डेटाबेस में सहेजा जा सके।


ज्ञानराज के अतिरिक्त: यहाँ आपको एक बढ़िया ब्लॉग प्रविष्टि मिलती है, जिस पर संवाद करने के लिए विभिन्न नियंत्रकों को प्राप्त करना है। साथ में खेलने के लिए मददगार jsfiddles के एक जोड़े भी हैं। onehungrymind.com/angularjs-communicating-between-controllers मुझे आशा है कि यह मदद करता है।
F Lekschas

जवाबों:


138

आपको एक सेवा का उपयोग करने की आवश्यकता है क्योंकि एक सेवा आपके ऐप के जीवन भर बनी रहेगी।

कहते हैं कि आप उपयोगकर्ता से संबंधित डेटा को बचाना चाहते हैं

इस तरह से आप सेवा को परिभाषित करते हैं:

app.factory("user",function(){
        return {};
});

आपके पहले नियंत्रक में:

app.controller( "RegistrationPage1Controller",function($scope,user){
    $scope.user = user;
    // and then set values on the object
    $scope.user.firstname = "John";
    $scope.user.secondname = "Smith";
});

app.controller( "RegistrationSecondPageController",function($scope,user){
        $scope.user = user;
        // and then set values on the object
        $scope.user.address = "1, Mars";

    });

6
आह! मैंने कोशिश की कि पहले लेकिन काम करने के लिए नहीं मिल सकता था क्योंकि मैंने दोनों मार्गों के लिए एक ही नियंत्रक का उपयोग किया था, इसलिए प्रत्येक नए मार्ग पर डिफ़ॉल्ट मान उन लोगों को लिख देगा जो मैंने पिछले पृष्ठ पर दर्ज किए हैं। दो नियंत्रकों के साथ, या कोई डिफ़ॉल्ट मानों के साथ, यह अब नहीं होता है। धन्यवाद!
एरिक होन

1
Value Recipe Docs.angularjs.org/guide/providers के बारे में , क्या यह myApp.value('clientId', 'a12345654321x');भी मार्गों के बीच लगातार है?
बंड्र

@ TheBrr: यह होना चाहिए। मूल्य सेवाओं का एक विशेष रूप हैं क्योंकि मैं इसे समझता हूं।
रॉबर्ट कोरिटनिक

3
यदि आप पृष्ठ को पुनः लोड करते हैं तो सेवाएँ डेटा को जारी नहीं रखेंगी ... इसलिए यदि आप अपने प्रपत्र के पृष्ठ 4 में हैं और उस पृष्ठ को पुनः लोड करते हैं, तो आप सभी भरे हुए डेटा को ढीला कर देंगे।
दानियालव्रत

1
अच्छा जवाब! साइड पॉइंट के रूप में, इस उत्तर को लेने वालों के लिए एक स्टाइल गाइड - ऐसी सेवाएँ जो स्वयं कंस्ट्रक्टर नहीं हैं (जैसे कि नई XX के रूप में उपयोग की जाती हैं) को लोअरकेस ऊंट का नाम दिया जाना चाहिए: github.com/mgechev/angularjs-style-guide
मैट ब्रेन

9

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

मुझे लगता है कि आप यूआई-राउटर का उपयोग कर रहे हैं ताकि आपको नामित नाम दिखाई दे सकें। फिर छद्म कोड में:

<div ng-controller="WizardController">
  <div name="stepView" ui-view/>
</div>

उसके बाद विजार्डकंट्रोलर उस स्कोप वेरिएबल को परिभाषित करता है जिसे आप मल्टी-पेज फॉर्म के चरणों में संरक्षित करना चाहते हैं (जिसे मैं "विज़ार्ड" के रूप में संदर्भित कर रहा हूं)। तब आपके रूट stepViewकेवल अपडेट होंगे । प्रत्येक चरण के अपने टेम्पलेट, नियंत्रक और स्कोप हो सकते हैं, लेकिन उनके स्कोप पृष्ठ से पृष्ठ पर खो जाते हैं। लेकिन विज़ार्डकंट्रोलर में स्कोप सभी पृष्ठों पर संरक्षित हैं।

चाइल्ड कंट्रोलर्स से विजार्डकंट्रोलर स्कोप्स को अपडेट करने के लिए, आपको प्रत्येक स्कोप वैरिएबल के लिए विजार्डकंट्रोलर पर $scope.$parent.myProp = 'value'एक फ़ंक्शन की तरह सिंटैक्स का उपयोग करने या परिभाषित करने की आवश्यकता होगी setMyProp। अन्यथा, यदि आप चाइल्ड कंट्रोलर्स से सीधे पेरेंट स्कोप वेरिएबल सेट करने की कोशिश करते हैं, तो आप पेरेंट वेरिएबल को शैडो करते हुए, बच्चे पर ही एक नया स्कोप वैरिएबल बना लेंगे।

समझाने के लिए तरह तरह के और मैं एक पूर्ण उदाहरण की कमी के लिए माफी माँगता हूँ। मूल रूप से आप एक पेरेंट कंट्रोलर चाहते हैं जो एक पेरेंट स्कोप स्थापित करे, जो आपके फॉर्म के सभी पृष्ठों पर संरक्षित रहेगा।


1
यह यूआई-राउटर के साथ काम करेगा (और यह पेज की तरह डिजाइन करने के लिए एक बहुत अच्छा तरीका है), लेकिन बॉक्स से बाहर नहीं। बॉक्स से बाहर सेवा विधि जाने का रास्ता है।
एरिक होन

1
बस स्पष्ट करने के लिए, पैरेंट स्कोप गुण हमेशा चाइल्ड स्कोप द्वारा विरासत में मिलेंगे। हालाँकि, यदि आप चाइल्ड स्कोप से पेरेंट स्कोप प्रॉपर्टी सेट करना चाहते हैं, तो आपको इसे पेरेंट पर एक्सेस करने की आवश्यकता है, अन्यथा आप चाइल्ड स्कोप पर एक ही नाम की नई प्रॉपर्टी बना रहे हैं। पैरेंट स्कोप प्रॉपर्टी सेट करके जा सकते हैं:$scope.$parent.myProp = 'hello world';
mbursill

1
यह एक सेवा का उपयोग करने की तुलना में बहुत अच्छा दृष्टिकोण है। सेवाएं एकल हैं, इसलिए किसी भी राज्य को परिभाषित किया गया है कि आवेदन के लिए वैश्विक है। यदि उपयोगकर्ता विज़ार्ड भाग के माध्यम से बाहर निकलता है, तो इसे फिर से शुरू करता है, पिछले रन से सेवा में बाएं-ओवर राज्य होगा - जब तक आप यह सुनिश्चित नहीं करते कि आप हर निकास बिंदु पर सेवा को ठीक से साफ करते हैं, लेकिन यह काफी हो सकता है आसानी से एक पर्याप्त रखरखाव सिरदर्द बन गया!
दान राजा

इस उत्तर के लिए बहुत अधिक उत्सुक
कुरई बंकसु

यदि आप कोणीय यूआई राउटर का उपयोग नहीं कर रहे हैं तो सेवाओं को ध्यान में रखना पहली बात है। यदि आप यूआई राउटर का उपयोग कर रहे हैं, हालांकि, इसमें नेस्टेड रिज़ॉल्यूशन है जो नेस्टेड दृश्यों के बीच जानकारी को बनाए रख सकता है। मुझे लगता है कि माता-पिता के दायरे का उपयोग करने की तुलना में एक क्लीनर दृष्टिकोण होगा। medium.com/opinionated-angularjs/…
losmescaleros

5

डेटा को दो तरीकों से नियंत्रकों के बीच पारित किया जा सकता है

  1. $rootScope
  2. नमूना

नीचे दिया गया नमूना मॉडल का उपयोग करके मूल्यों के पारित होने को दर्शाता है

app.js

angular.module('testApp')
  .controller('Controller', Controller)
  .controller('ControllerTwo', ControllerTwo)
  .factory('SharedService', SharedService);

SharedService.js

function SharedService($rootScope){

 return{
    objA: "value1",
    objB: "value2"
  }
}

// नियंत्रक ए में मूल्य को संशोधित करें

Controller.js

function Controller($scope, SharedService){

 $scope.SharedService = SharedService;

 $scope.SharedService.objA = "value1 modified";
}

// कंट्रोलरव्यू में मूल्य तक पहुंचें

ControllerTwo.js

function ControllerTwo($scope, SharedService){

 $scope.SharedService = SharedService;

 console.log("$scope.SharedService.objA"+$scope.SharedService.objA); // Prints "value1 modified"
}

उम्मीद है की यह मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.