AngularJS ui रूटर URL के बिना राज्यों के बीच डेटा गुजर रहा है


146

मैं url में डेटा को उजागर किए बिना दो राज्यों के बीच डेटा पारित करने की इस समस्या का सामना कर रहा हूं, यह ऐसा है जैसे उपयोगकर्ता वास्तव में इस राज्य पर सीधे नहीं उतर सकते।

उदाहरण के लिए। मेरे दो राज्य हैं "ए" और "बी"। मैं राज्य "ए" में कुछ सर्वर कॉल कर रहा हूं और "बी" राज्य को कॉल की प्रतिक्रिया पास कर रहा हूं। सर्वर कॉल की प्रतिक्रिया एक स्ट्रिंग संदेश है, जो काफी लंबा है, इसलिए मैं इसे यूआरएल में उजागर नहीं कर सकता।

तो क्या url params का उपयोग किए बिना, राज्यों के बीच डेटा पास करने के लिए कोणीय ui राउटर का कोई तरीका है?

जवाबों:


185

हम उपयोग कर सकते हैं params, नई यूआई-रूटर की सुविधा:

एपीआई संदर्भ / ui.router.state / $ stateProvider

paramsएक नक्शा जो वैकल्पिक रूप से यूआरएल में घोषित मापदंडों को कॉन्फ़िगर करता है, या अतिरिक्त गैर-यूआरएल मापदंडों को परिभाषित करता है। प्रत्येक पैरामीटर को कॉन्फ़िगर किया जा रहा है, पैरामीटर के नाम के लिए एक कॉन्फ़िगरेशन ऑब्जेक्ट जोड़ें।

भाग देखें: " ... या अतिरिक्त गैर-यूआरएल मापदंडों को परिभाषित करता है ... "

तो राज्य की अवहेलना होगी:

$stateProvider
  .state('home', {
    url: "/home",
    templateUrl: 'tpl.html',
    params: { hiddenOne: null, }
  })

कुछ उदाहरण ऊपर उल्लिखित दस्तावेज़ का निर्माण करते हैं :

// define a parameter's default value
params: {
  param1: { value: "defaultValue" }
}
// shorthand default values
params: {
  param1: "defaultValue",
  param2: "param2Default"
}

// param will be array []
params: {
  param1: { array: true }
}

// handling the default value in url:
params: {
  param1: {
    value: "defaultId",
    squash: true
} }
// squash "defaultValue" to "~"
params: {
  param1: {
    value: "defaultValue",
    squash: "~"
  } }

EXTEND - काम करने का उदाहरण: http://plnkr.co/edit/inFhDmP42AQyeUBmyIVl?p=info

यहाँ एक राज्य की परिभाषा का एक उदाहरण दिया गया है:

 $stateProvider
  .state('home', {
      url: "/home",
      params : { veryLongParamHome: null, },
      ...
  })
  .state('parent', {
      url: "/parent",
      params : { veryLongParamParent: null, },
      ...
  })
  .state('parent.child', { 
      url: "/child",
      params : { veryLongParamChild: null, },
      ...
  })

यह ui-sref का उपयोग करके कॉल हो सकता है:

<a ui-sref="home({veryLongParamHome:'Home--f8d218ae-d998-4aa4-94ee-f27144a21238'
  })">home</a>

<a ui-sref="parent({ 
    veryLongParamParent:'Parent--2852f22c-dc85-41af-9064-d365bc4fc822'
  })">parent</a>

<a ui-sref="parent.child({
    veryLongParamParent:'Parent--0b2a585f-fcef-4462-b656-544e4575fca5',  
    veryLongParamChild:'Child--f8d218ae-d998-4aa4-94ee-f27144a61238'
  })">parent.child</a>

यहां उदाहरण देखें


जैसा कि सुझाव दिया गया है, मैंने एक नेस्टेड स्थिति पर उदाहरणों का उपयोग करने की कोशिश की है (उदाहरण - "/ उपयोगकर्ता / प्रोफ़ाइल / संपर्क", यह मुझे कुछ त्रुटि देता है। क्या मुझे मूल स्थिति के लिए "params" को परिभाषित करने की आवश्यकता है?
vijay tyagi

ऐसा लगता है कि माता-पिता को परिभाषित किए गए सवालों के जवाब देने के लिए आवश्यक नहीं है, विस्तृत उत्तर के लिए धन्यवाद।
विजया त्यागी 13

अगर वह किसी भी तरह से मदद करता है तो बढ़िया है;) शक्तिशाली यूआई-राउटर का आनंद लें
रेडिम कोहलर

1
दुर्भाग्य से यह साथ काम नहीं करता 0.2.10 ui रूटर और कहा कि क्या मैं उपयोग कर रहा हूँ, के लिए 0.2.10 संस्करण बदलने पर यह त्रुटि आई है - त्रुटि: राज्य 'घर' में अमान्य पैरामीटर
विजय त्यागी

1
@vijaytyagi, आपको अपग्रेड करना चाहिए। बस, पुराने संस्करण को चालू रखने का कोई कारण नहीं है। और जहां तक ​​मुझे याद है, चाल सुचारू होनी चाहिए ...
रेडिम कोहलर

38

परमेस ऑब्जेक्ट को $ राज्यप्रेम में शामिल किया गया है, लेकिन यह यूआरएल का हिस्सा नहीं होगा।

1) मार्ग विन्यास में:

$stateProvider.state('edit_user', {
    url: '/users/:user_id/edit',
    templateUrl: 'views/editUser.html',
    controller: 'editUserCtrl',
    params: {
        paramOne: { objectProperty: "defaultValueOne" },  //default value
        paramTwo: "defaultValueTwo"
    }
});

2) नियंत्रक में:

.controller('editUserCtrl', function ($stateParams, $scope) {       
    $scope.paramOne = $stateParams.paramOne;
    $scope.paramTwo = $stateParams.paramTwo;
});

3 ए) एक नियंत्रक से राज्य को बदलना

$state.go("edit_user", {
    user_id: 1,                
    paramOne: { objectProperty: "test_not_default1" },
    paramTwo: "from controller"
});

3B) HTML में स्टेट को बदलना

<div ui-sref="edit_user({ user_id: 3, paramOne: { objectProperty: 'from_html1' }, paramTwo: 'fromhtml2' })"></div>

उदाहरण प्लंकर


1
धन्यवाद, एकदम सही। यह भी देखा गया है कि यदि आप $ राज्य और $ राज्यप्रेम दोनों चाहते हैं, तो आपको केवल $ राज्य को इंजेक्ट करने की आवश्यकता है। StateParams ऑब्जेक्ट $ राज्य की एक संपत्ति है: $ state.params।
माइकल के

1
यह बताया जाना चाहिए कि चरण 1 (डिफ़ॉल्ट मान प्रदान करते हुए) उन्हें बाकी काम करने के लिए आवश्यक है ;-)
Xtreme बाइकर

2
संक्षिप्त उदाहरण के लिए धन्यवाद। मेरे लिये कार्य करता है! (यूआई-राउटर वी 1.0.3)
रोबोप्रोग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.