एक

2015-06-24 13 views
8

के रूप में कई ui-बार देखा गया एनिमेट के लिए सर्वश्रेष्ठ अभ्यास मैं एक ऐप्लिकेशन है जो मूल रूप से इसएक

<div ui-view="header"> 
<div ui-view="main"> 
<div ui-view="footer"> 

अब की तरह लग रहा है, पाद एप्लिकेशन के सभी अलग-अलग राज्यों के लिए ही रहेगा, लेकिन हैडर बदल जाएगा कुछ राज्यों में, लेकिन कई राज्यों में सामग्री साझा करते हैं। केवल ui-view जो सभी राज्यों में बदल जाएगा ui-view="main" है।

वर्तमान में मेरी $stateProvider इस तरह (पादलेख अभी तक लागू नहीं) दिखता है:

app.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) { 
    $stateProvider.state('root',{ 
     url: '', 
     abstract: true, 
     views: { 
     'header': { 
      templateUrl: appHelper.views+'/header.html', 
     }, 
     } 
    }) 
    .state('root.home', { 
     url: '/', 
     views: { 
     'header': { 
      templateUrl: appHelper.views+'/header.html', 
     }, 
     '[email protected]': { 
      templateUrl: appHelper.views+'/home.html', 
      controller: 'HomeController as homeVm', 
     } 
     }, 
     resolve: { 
     posts: function(dataService) { 
      return dataService.getPosts(); 
     }, 
     artists: function(dataService) { 
      return dataService.getArtists(); 
     } 
     } 
    }) 
    .state('root.artist', { 
     url: '/artist/:slug', 
     views: { 
     '[email protected]': { 
      templateUrl: appHelper.views+'/artistHeader.html', 
      controller: 'ArtistController as artistVm', 
     }, 
     '[email protected]': { 
      templateUrl: appHelper.views+'/artist.html', 
      controller: 'ArtistController as artistVm', 
     } 
     }, 
     resolve: { 
     artist: function($stateParams, dataService) { 
      return dataService.getArtist($stateParams.slug);  
     } 
     } 
    }); 
}]); 

अब तक तो अच्छा। लेकिन यहां पकड़ है। संक्रमण के दौरान मैं सभी ui-view एस को एक के रूप में एनिमेट करना चाहता हूं। बातें मेरे मामले में एकजुट दिखने के लिए (यह एक फीका एनीमेशन है) मैं उन्हें एक रैपिंग div में डाल दिया और कि div करना चाहते हैं में फीका (प्रत्येक अलग ui-view पर यह कर कुरूपता के सभी प्रकार का कारण होगा) फीका बाहर/करते हैं।

इस परिदृश्य में सबसे अच्छा अभ्यास क्या है?

मैं उन्हें एक ui-view में लपेट और ऊपर हुक कि $stateProvider किसी भी तरह में करते हैं (नेस्ट ui-view रों?)। क्या ऐसा करने के कोई अन्य तरीके हैं? क्या मैं $stateChange सुन सकता हूं और ngAnimate जैसे मेरे रैपर में कक्षाएं ui-view के साथ लागू कर सकता हूं? (तब बाहर फीका जब तक पूरी तरह से लुप्त होने से पहले एक सफल संकल्प के साथ बाहर फीका)।

मेरी Googling प्रयासों से ऐसा लगता है ui-view ज्यादा प्राथमिकता दी जाती है जब संक्रमण प्रकार की एनिमेशन से निपटने।

+0

'$ stateChangeStart' और' $ stateChangeSuccess' ईवेंट में एनिमेशन कुछ अजीब साइड इफेक्ट्स हैं, इसलिए उनसे बचें (इस समय)। जब तक ui-राउटर के पास जेएस के माध्यम से 'event.preventDefault()' एनिमेशन के अलावा संक्रमण वादे का प्रबंधन करने का एक बेहतर तरीका नहीं होगा, तब तक मुश्किल होगी। तीन 'यूई-व्यू' चलाना और उन्हें सिंक्रनाइज़ेशन से एनिमेट करना शुद्ध सीएसएस के माध्यम से कोई समस्या नहीं होनी चाहिए। यूई-राउटर एफएक्यू अनुभाग में एक नज़र डालें, संक्रमण को एनिमेट करने के लिए समर्पित एक अनुभाग है। –

+0

जबकि एनीमेशन वास्तव में सिंक्रनाइज़ेशन है, यह डिज़ाइन के साथ समस्या का कारण बनता है क्योंकि स्क्रॉल के दौरान व्यूपोर्ट के शीर्ष पर 'हेडर' तय किया जाता है। जब फीका शुरू होता है तो यह नीचे 'मुख्य' की सामग्री प्रकट करेगा जो वांछित नहीं है। एक रैपर के साथ यह स्पष्ट रूप से एक समस्या नहीं है क्योंकि यह एक एकल तत्व के रूप में फीका होगा .. – INT

उत्तर

2

... संक्रमण के दौरान मैं सभी यूई-विचारों को एक के रूप में एनिमेट करना चाहता हूं। बातें मेरे मामले में एकजुट दिखने के लिए (यह एक फीका एनीमेशन है) मैं चाहते हैं उन्हें एक रैपिंग div में डाल दिया और/फीका में फीका बाहर करना है कि div के लिए (प्रत्येक अलग ui-व्यू पर यह कर सभी का कारण होगा बदसूरत के प्रकार)।

इस परिदृश्य में सबसे अच्छा तरीका क्या है?

विकल्प 1: का उपयोग करते हुए घटना हुक $stateChangeStart और $stateChangeSuccess

यह दृष्टिकोण के रूप में @ दाऊद टिप्पणी में उल्लेख किया है कुछ दुष्प्रभाव हो जाएगा। इसलिए ui-router तक राज्य संक्रमण वादे का प्रबंधन करने के लिए एक बेहतर तरीका के साथ आता है। संक्रमण होने से रोकने के लिए वर्तमान में यह event.preventDefault() पर निर्भर करता है।

असल में, ui-router आपके ui-view मार्ग परिवर्तन दृश्य-आउट को आने वाले व्यू-इन के साथ ही आग लगा देगा। तो क्या आप प्राप्त पिछले ui-view अभी भी दिखाई दे जबकि अगले ui-view प्रदान की गई है और आपको व्यू-बाहर एनिमेट कर रहे हैं तो पुराने दृश्य और नए के बीच ओवरलैप के कि संक्रमण की अवधि हो जाएगा। आप $stateProvider में,

इसी तरह के कारणों के लिए उन्हें एक और ui-view में लपेटकर और hooking उन्हें (में नया एक एनिमेट से पहले) नई ui-व्यू प्रतिपादन जब तक पुराने एक बाहर एनिमेट समाप्त हो गया है पर बंद धारण करने चाहिए होगा बुद्धिमान नहीं

विकल्प 2: (अनुशंसित) सीएसएस आधारित एनिमेशन

मैं ज्यादातर सीएसएस आधारित बदलाव के साथ जाने के लिए और आप को प्राप्त हो सकता है यह या तो

  • प्रत्येक ui-view के लिए एक आम CSS वर्ग बताए और एनीमेशन लगाने से उस वर्ग पर।
  • या <div> में तीन ui-view संलग्न करना (यदि आपको वास्तव में इसकी आवश्यकता है) और उस पर एनीमेशन लागू करें।

किसी भी तरह से, आप एक निकाय के रूप में सभी ui-views इलाज किया जाएगा और एनिमेट उन्हें बातें अधिक एकजुट देखो होगा।

HTML:

<div ui-view="header" ></div>  
<div ui-view="main" ></div> 
<div ui-view="footer" ></div> 

सीएसएस:

[ui-view].ng-enter { 
    animation: fadein 2s; 
} 

@keyframes fadein { 
    from { opacity: 0; } 
    to { opacity: 1; } 
} 

यहाँ एक काम plunkr आपके उपयोग के मामले जहां, मैं एक सार राज्य root और तीन नेस्टेड राज्यों root.home, root.artist और root.band है पर आधारित है। जबकि ui-view='main' सभी राज्यों में बदल जाता है, ui-view='footer' किसी भी और ui-view='header' राज्य में 'root.artist' के लिए परिवर्तन नहीं करता है। तथ्य यह है कि आप एनिमेशन को ट्रिगर करने के लिए सीएसएस आधारित .ng-enter और .ng-leave कक्षाओं का उपयोग कर रहे हैं, तो आप तकनीकी रूप से पिछले दृष्टिकोण वाले मुद्दों को दूर करते हैं।

$stateProvider 
     .state('root',{ 
      abstract:true, 
      views:{ 
       'header':{ //absolutely targets the 'header' view in root unnamed state. 
       templateUrl:'header.html' 
       }, 
       'footer':{ //absolutely targets the 'footer' view in root unnamed state. 
       templateUrl:'footer.html' 
       } 
      } 
     }) 
     .state('root.home',{ 
      views:{ 
       '[email protected]':{ 
       templateUrl:'main.html' 
       }, 
      }   
     }) 
     .state('root.artist',{ 
      views:{ 
       '[email protected]':{ 
       templateUrl:'artist-header.html' 
       }, 
       '[email protected]':{ 
       templateUrl:'artist-main.html' 
       }, 
      }   
     }) 
     .state('root.band',{ 
      views:{ 
       '[email protected]':{ 
       templateUrl:'band-main.html' 
       }, 
      }   
     }) 
+0

अरे @ एनएलएन, आपके व्यापक उत्तर के लिए धन्यवाद! मैंने जिस समस्या का सामना कर रहा हूं उसे बेहतर ढंग से प्रतिबिंबित करने के लिए मैंने आपके प्लंकर को थोड़ा सा अपडेट किया है: http://plnkr.co/edit/mLUqKIjby9WGZ60k56ym?p=preview फीड आउट के साथ आपको divs को पूर्ण स्थिति भी प्राप्त करनी होगी जो इसे थोड़ा सा बनाता है पाद लेख के साथ मुश्किल है। इस प्रकार मैं व्यक्तिगत divs की बजाय पैरेंट div को एनिमेट करने में सक्षम होना चाहता हूं (जैसा कि आप लाल और नीले divs ओवरलैप देख सकते हैं जो ओपेसिटी में आने पर बिल्कुल अच्छा नहीं दिखता है)। – INT