2016-07-28 18 views
14

में काम नहीं करती है, मुझे निम्नलिखित कोड के लिए कुछ अजीब व्यवहार का सामना करना पड़ रहा है।आलसी लोडिंग कभी-कभी कोणीय

function linkFunc(scope, element, attribute) { 
     var page = angular.element($window); 

     page.bind('scroll', function() { 

      var windowHeight = "innerHeight" in window ? window.innerHeight : document.documentElement.offsetHeight; 
      var body = document.body, html = document.documentElement; 
      var docHeight = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight); 
      var windowBottom = windowHeight + window.pageYOffset; 

      if (windowBottom >= docHeight) { 
       scope.$apply(attribute.myDirective); 
      } 
     }); 
    } 

ऊपर कोड का एक टुकड़ा है, तो पृष्ठ के नीचे, तक पहुँच जाता है, तो इसकी पहुंच गया यह फोन करेगा जो कुछ भी समारोह बाँध myDirective

करने के लिए मुख्य मुद्दा यह है कि समय के सबसे अधिक है का पता लगाता है कि है आलसी लोडिंग काम करता है, और myDirective को सफलतापूर्वक बुलाया जाता है। हालांकि कुछ बार आलसी लोडिंग काम नहीं करेगी, और मैं बग को पुन: उत्पन्न करने में सक्षम नहीं था।

मैंने अलग-अलग स्क्रीन आकार, विभिन्न ब्राउज़र की कोशिश की, लेकिन ऐसा लगता है कि बग यादृच्छिक रूप से होता है।

शायद किसी के साथ यह उनके साथ हुआ है, और मुझे एक दिशा बता सकता है?

संपादित करें:

अधिक जानकारी

मैं प्रयोग का एक सा के बाद बग पुन: पेश करने में सक्षम था।

असल में, जब ब्राउज़र के प्रतिशत में ज़ूम < 100 % है, window.pageY दशमलव मान है कि थोड़ा गलत है देता है जिसके कारण windowBottom एक 0.9

जैसे को 0.1 द्वारा बंद किया जाना है।

  console.log(windowBottom); // 1646.7747712336175 
      console.log(docHeight); // 1647 

क्या कोई जानता है कि ऐसा क्यों होता है?

संपादित करें 2:

ऊपर व्यवहार भी गैर नियतात्मक है, लेकिन दशमलव हिस्सा सच है। !

+1

यह कोणीय निर्देश तैयार करने का एक असामान्य तरीका है; यह विशिष्ट यूआई घटनाओं के लिए जावास्क्रिप्ट के निष्पादन को शुरू करने के लिए कोणीय के डिजाइन सिद्धांतों का मुकाबला करता है। – Claies

+0

आपके पास स्क्रीन के नीचे क्रोम देव कंसोल नहीं है? मुझे लगता है कि यह समान कोड की ऊंचाई धारणा पर थोड़ा विचित्र प्रभाव डाल सकता है। – cYrixmorten

+0

@cYrixmorten मेरे पास स्क्रीन के नीचे क्रोम देव कंसोल नहीं था, हालांकि मैंने कोशिश की थी, लेकिन व्यवहार अभी भी गैर निर्धारक नहीं है। – testing

उत्तर

3

0,1 + 0,2 == 0.3

यह एक अजीब जावास्क्रिप्ट में न सिर्फ है; यह वास्तव में कंप्यूटर विज्ञान में एक मौजूदा समस्या है, और यह कई भाषाओं को प्रभावित करता है। इसका उत्पादन 0.30000000000000004 है।

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

आप here पढ़ सकते हैं। ब्राउज़र स्रोत में खोदने के बिना, मुझे लगता है कि आपकी समस्या इस से उत्पन्न होती है।

+0

डाउनवॉटेड। ओपी के सवाल का जवाब नहीं देता है या इस मुद्दे को हल नहीं करता है। – DhruvPathak

+0

ऊपर वोट। यह सवाल का जवाब देता है। यदि आप प्रश्न के अतिरिक्त पढ़ते हैं तो यह पता चला है कि समस्या गणितीय परिचालनों को कैसे प्रबंधित करती है। –

+0

@ ध्रुवपथक "क्या कोई जानता है कि ऐसा क्यों होता है?" आखिर में ओपी का सवाल है क्योंकि वह पहले से ही अपने – adamdport

3

फ़्लोटिंग-पॉइंट परिशुद्धता के मुद्दों को देखते हुए, यदि आप दो मान 1 पिक्सेल से कम हैं तो आप इसे जांचने के लिए स्थिति को छोड़ना चाहेंगे।उदाहरण के लिए:

if (Math.abs(windowBottom - docHeight) < 1) { 
    scope.$apply(attribute.myDirective); 
} 
+0

ग्रेट पर अपराधी की खोज कर चुका है! यह मुझे mcgraphix मदद की :) –

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