2016-06-09 3 views
9

मुझे ng-class के साथ कुछ अजीब समस्या है, और मुझे संदेह है कि इसे दौड़ की स्थिति के साथ करना है।एनजी-क्लास और एनीमेशन के साथ रेस हालत

यहाँ यहाँ यहाँ प्रासंगिक js कोड

self.slideLeft = function() { 
     if (self.end_index < self.list_of_stuff.length) { 
      self.direction = 'left'; 

      debugger; 
      self.start_index = self.start_index + 4; 
      self.end_index = self.end_index + 4; 
      self.display_list = self.list_of_stuff.slice(self.start_index, self.end_index);    
     } 

    } 

    self.slideRight = function() { 
     if (self.start_index > 0) { 
      self.direction = 'right'; 
      debugger; 

      self.start_index = self.start_index - 4; 
      self.end_index = self.end_index - 4; 
      self.display_list = self.list_of_stuff.slice(self.start_index, self.end_index);    
     } 
    } 

है प्रासंगिक एचटीएमएल

<div class="stuff-wrapper"> 
    <div class="stuff" 
     ng-class="bCtrl.directionClass()" 
     ng-repeat="stuff in bCtrl.display_list"> 
     {{stuff}} 
    </div> 
    </div> 

है यहाँ एनीमेशन है plunker example

है।

.left.ng-enter, 
.left.ng-leave { 
    -webkit-transition: all 1s ease-in-out; 

} 

.left.ng-enter { 
    transition-delay: 0.7s; 
    opacity: 0; 
    left: 10%; 
} 
.left.ng-enter-active { 
    opacity: 1; 
    left: 0; 
} 

.left.ng-leave { 
    opacity: 1; 
    left: -10%; 
} 
.left.ng-leave-active { 
    left: -20%; 
    opacity: 0; 
} 

यह एक साधारण ऐप है जो संख्या की एक सूची को बाएं और दाएं स्लाइड करता है।

यदि बाएं बटन दबाया जाता है, तो संख्याएं बाएं रहती हैं।

यदि दायां बटन दबाया जाता है, तो संख्याएं सही होती हैं।

लेकिन हम देखते हैं कि यदि दिशा में कोई बदलाव आया है, तो नंबर पहले गलत दिशा में स्लाइड करेगा, और बाद की दिशा सही होगी।

मुझे संदेह था कि यह दौड़ की स्थिति के कारण है।

दरअसल, मुझे लगता है कि ng-class डीबगर का उपयोग करते हुए self.direction दिशा बदलने के ठीक बाद लागू नहीं होता है।

यह बहुत उत्सुक है।

इस से निपटने के लिए कोई तरीका है?

उत्तर

6

इस (https://stackoverflow.com/a/21664152/2402929) प्रश्न से जवाब के शब्दों में:

आप सीएसएस वर्ग डोम पर अद्यतन किया जाता है के बाद $ scope.elements में परिवर्तन करने की जरूरत है। इसलिए आपको एक डायजेस्ट लूप के लिए डीओएम मैनिपुलेशन में देरी करने की आवश्यकता है। आप सीएसएस अद्यतन कर रहे हैं के रूप में

आपका तत्व एक ही पचाने पाश में हटाया जा रहा है: यह $ टाइमआउट सेवा द्वारा किया जा सकता है (कृपया इस उत्तर के लिए अधिक जानकारी AngularJS $ evalAsync बनाम $ टाइमआउट देखें) कक्षाएं। मतलब - सीएसएस अद्यतन नहीं होता है और तत्वों को हटा दिया जाता है।

डाइजेस्ट लूप आपके पूरे एनजी-क्लिक फ़ंक्शन को शामिल करेगा, क्योंकि सभी कोणीय अंतर्निहित निर्देशों के साथ कोड $ $ के दायरे में लपेटा जाता है। $ कॉल लागू करें।

स्पष्ट करने के लिए:।

$ गुंजाइश $ (लागू) एक समारोह या एक कोणीय अभिव्यक्ति स्ट्रिंग लेता है, और वह निष्पादित तो $ गुंजाइश कॉल $ डाइजेस्ट() किसी भी बाइंडिंग या पर नजर रखने वालों को अद्यतन करने के। ।

आप इसके बारे में यहां और अधिक पढ़ सकते हैं (http://jimhoskins.com/2012/12/17/angularjs-and-apply.html)।

तो क्या हल करती है आपकी समस्या को एक $ टाइमआउट ब्लॉक में अपने सरणी से डेटा को हटाने, जो एक के लिए डोम हेरफेर देरी पाश को पचाने जाएगा और वर्गों के बदलते और डेटा को हटाने के अलग रैपिंग है:

http://plnkr.co/edit/30wJhL?p=preview

:
self.slideLeft = function() { 
      if (self.end_index < self.list_of_stuff.length) { 
       self.direction = 'left'; 

       self.start_index = self.start_index + 4; 
       self.end_index = self.end_index + 4; 
       $timeout(function(){ 
       self.display_list = self.list_of_stuff.slice(self.start_index, self.end_index);    
       }); 
      } 

     } 

     self.slideRight = function() { 
      if (self.start_index > 0) { 
       self.direction = 'right'; 

       self.start_index = self.start_index - 4; 
       self.end_index = self.end_index - 4; 
       $timeout(function(){ 
       self.display_list = self.list_of_stuff.slice(self.start_index, self.end_index);    
       }); 
      } 
     } 

और यहाँ काम कर रहे plunker है

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