2012-09-29 13 views
14

नीचे दिए गए परिदृश्य में संदेश पास करने का सबसे अच्छा तरीका क्या है।विचारों के बीच ऑब्जेक्ट पास करना (फ़्लैश संदेश)

$scope.p.$save की सफलता परिदृश्य में, परिणाम में एक संदेश (res.message) है, जिसे मैं अगले दृश्य ($location.path("/test/"+res.reply.Id)) में प्रदर्शित करना चाहता हूं। AngularJS के बिना, मैं इसे यूआरएल में पास कर सकता हूं या इसे सत्र कुकीज़ में सहेज सकता हूं। लेकिन, मुझे लगता है कि AngularJS में एक बेहतर तरीका हो सकता है क्योंकि कोई ब्राउज़र रीडायरेक्ट नहीं है और राज्य उपलब्ध होना चाहिए। इस लक्ष्य को हासिल करने का सबसे अच्छा तरीका क्या है?

इसे रूटस्कोप में सेट करना इसे दिखाता है, जबकि मैं ब्राउज़र बैक बटन का उपयोग करता हूं, और संदेश का दायरा केवल नए दृश्य के लिए पहली नेविगेशन के लिए होना चाहिए।

function NewCtrl(Phone, $location, $rootScope, $scope) { 
    $scope.p = new Phone(); 
    $scope.save = function() { 
     $scope.p.$save(
      {}, 
      function (res) { 
       $rootScope.message = res.message **//<-- this will cause message still set when using browser back button, etc** 
       $location.path("/test/"+res.reply.Id); **//<-- Req: needs to pass the message to next view** 
      }, function (res) { 
      //TODO 
      } 
     ); 
    }; 
} 
.... 
PhoneApp.factory('Phone', function ($resource) { 
    return $resource('/api/test/:_id') 
}); 

उत्तर

16

आप एक सेवा का उपयोग कर सकते हैं जो $ChangeSuccess पर फ्लैश प्रदर्शित करता है।

प्रत्येक बार जब आप एक फ्लैश संदेश सेट करते हैं, इसे एक कतार में जोड़ें, और जब मार्ग बदलता है तो कतार से पहले आइटम ले लें और इसे वर्तमान संदेश पर सेट करें।

यहाँ एक डेमो है:

http://plnkr.co/edit/3n8m1X?p=preview

+0

धन्यवाद आप आपकी मदद और प्रयास के लिए बहुत ज्यादा। – bsr

+0

मैंने अभी इसे संपादित किया है, मैंने एक ** अधिक ** बेहतर और सरल कार्यान्वयन के बारे में सोचा, जो एक सरणी का उपयोग करके एकाधिक चमक का समर्थन करता है। –

+1

आप कभी भी $ $ChangeStart' पर विचार कर सकते हैं क्योंकि सफलता कभी-कभी (आपके सेटअप के आधार पर) प्रक्रिया में बहुत देर हो चुकी है (नया पृष्ठ पहले ही लोड हो सकता है और अलर्ट स्कोप हल हो सकता है)। –

0

मुझे विश्वास नहीं है कि यह कोणीयजेएस के लिए यह डिफ़ॉल्ट करने का एक तरीका है। आपकी सबसे अच्छी शर्त केवल क्वेरी स्ट्रिंग के माध्यम से संदेश (एन्कोडेड) पास कर देगी।

5

मैं इसी तरह की सुविधा लागू करने के लिए देख रहा था, लेकिन वास्तव में एक ग्राउल शैली संदेश के और अधिक चाहता था।

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

मेरा अपडेट आपको अधिसूचना प्रकार (जानकारी, चेतावनी, सफलता, त्रुटि) और शीर्षक निर्दिष्ट करने देता है।

'पॉप' विधि कतार में संदेश जोड़ती है, और इसके बजाय तुरंत स्क्रीन पर पॉप अप करती है। एंडी के पिछले प्लिंकर से सेट/प्राप्त कार्यक्षमता अधिकतर अपरिवर्तित बनी हुई है।

आप यहाँ मेरी अद्यतन पा सकते हैं: http://plnkr.co/edit/MY2SXG?p=preview

+0

यह ध्यान देने योग्य है कि अगर आप ऑब्जेक्ट ऑब्जेक्ट फ्लैश.सेट() में पास करते हैं तो यह एक एनजीमोडेल है, यह संदर्भ द्वारा पारित किया जाता है, इसलिए कतार में कई प्रविष्टियां क्लोन होंगी एक ही वस्तु का। दूसरे शब्दों में, यदि आप ऐसा कुछ करते हैं: $ scope.msg = {title: 'title', body: 'msg body', टाइप: 'info'}; उसके बाद इसका उपयोग इस मॉडल के रूप में करते हुए और इस स्कोप चर को सेट करने के लिए पास करें, कतार में पहले से ही कुछ भी नए मानों को बदलने के लिए बदला जाएगा ... किस तरह की संदेश कतार के उद्देश्य को हरा देता है;) –

+0

आपका मूल उदाहरण में टोटर लाइब्रेरी को लोड करने में कोई समस्या थी - मैंने नमूना अपडेट किया और टोस्टर स्क्रिप्ट इनलाइन शामिल किया: http://plnkr.co/edit/vSWKtv?p=preview –

+0

धन्यवाद। मैंने लिखा है कि कुछ बदलना चाहिए .. यह पहले लोड हो रहा था :) –

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