2015-06-17 4 views
24

अगर मैं एक राय यह है कि करता है:एनजी-एंजल के साथ एक बार बाध्यकारी?

<div ng-repeat="foo in foos"> 
    <p ng-if="bar">omg lol</p> 
    <p ng-if="!bar">lol omg</p> 
</div> 

मैं वास्तव में बनाने हूँ (2 * foos.length) + 1 $$ पर नजर रखने वालों, जो वास्तव में अच्छा नहीं है। मुझे ऑनलाइन कई स्रोत मिल गए हैं जो कहते हैं कि आप एनजी-अगर = ":: बार" कर सकते हैं, लेकिन जब मैं ऐसा करता हूं तो दर्शक की संख्या बदलती नहीं है। क्या एनजी को मजबूर करने का कोई तरीका है-अगर एक बार बाध्यकारी हो?

यह है सच में, सच गूंगा क्या करना है करने के लिए:

<div ng-repeat="foo in foos" ng-if="bar"> 
    <p>omg lol</p> 
</div> 
<div ng-repeat="foo in foos" ng-if="!bar"> 
    <p>lol omg</p> 
</div> 

कौन सा मेरा मानना ​​है कि मुझे के बजाय 4 $$ पर नजर रखने वालों की तरह कुछ दे देंगे ... तो मैं एक वैकल्पिक रहा हूँ होने के लिए होने से बचाने के उस तरह मूर्खतापूर्ण।

+0

:: एक बार बाध्यकारी है। बस शुरुआत में एक अस्थायी घड़ी बनाई जाएगी और फिर बाध्य संपत्ति को मूल्य आवंटित करने के बाद हटा दिया जाएगा। क्या आपके पास सबूत प्लंकर है? – PSL

+1

हां, यहां एक प्लंकर दिखाया गया है कि डोम को प्रस्तुत करने के 2 सेकंड बाद, $$ वॉचर गिनती केवल एक एनजी-अगर से है ... http://plnkr.co/edit/JgP3lRyuSoSPQNIgR8Ri?p=preview – patrick

+1

मैं जो देखता हूं वह है ['

  • {{:: item}}
  • '] (http://plnkr.co/edit/Eg9t3X?p=preview) वॉचर गिनती ==> 2 ['' '' '' 'के साथ' lol' उपसर्ग किए बिना यह 1002 है] (http://plnkr.co/edit/cwAun9?p=preview)। आपने क्या कहा? – PSL

    उत्तर

    34

    बस मेरी टिप्पणी का विस्तार जवाब देने के लिए।

    कोणीय 1.3 एक बार बाध्यकारी वाक्यविन्यास (::) वास्तव में अनावश्यक घड़ियों को हटा देगा। प्रासंगिक डेटा सेट करने के बाद बस आपको घड़ियों को मापने की आवश्यकता है। यही कारण है कि यह है। जब आप दृश्य पर एक बार बाध्य संपत्ति सेट करते हैं, तो कोणीय परिभाषित मान प्राप्त होने तक एक अस्थायी घड़ी सेट करेगा, यानी undefined पर कुछ भी। यह दृष्टिकोण एक कारण के लिए है - अजेक्स कॉल, टाइमआउट, वादे श्रृंखला रिज़ॉल्यूशन इत्यादि जैसे स्थगित ऑपरेशन के माध्यम से आबादी वाले बाध्य मूल्यों का समर्थन करने के लिए .. इस :: बिना किसी भी चीज़ पर सफलतापूर्वक काम नहीं करेगा बल्कि पूर्व-जनबद्ध बाध्य मूल्यों पर काम नहीं करेगा।

    तो बस सुनिश्चित करें कि आप कुछ समय पर कुछ मूल्य निर्धारित मूल्यों पर कुछ मूल्य निर्धारित करते हैं। इसे अपरिभाषित न होने दें।

    कहें कि आपकी स्थिति <div ng-if="::lol"></div> दो बार दोहराई गई है। बस यह सुनिश्चित करें कि जब आप पुनरावर्तक के मान को बाध्य करते हैं या कुछ ऑपरेशन lol की स्थिति निर्धारित करता है, भले ही वह ऑपरेशन विफल हो जाए (एजेक्स कॉल त्रुटि कहें) अभी भी एक मान निर्धारित करें (यहां तक ​​कि null जावास्क्रिप्ट में भी एक मान है)। आने वाले पाचन चक्र के बाद घड़ियां हटा दी जाएंगी जो संबंधित डोम बाइंडिंग प्रस्तुत करती है।

    अपने विशिष्ट plunker में आप के रूप में अच्छी कर सकता है:

    <ul ng-repeat="item in items" ng-if="::lol"> 
        <li>{{ ::item }}</li> 
    </ul> 
    

    बजाय

    <ul ng-repeat="item in items"> 
        <li ng-if="::lol">{{ ::item }}</li> 
    </ul> 
    
    0

    ऐसा करने के लिए Bindeonce उपयोग करने की आवश्यकता: https://github.com/Pasvaz/bindonce

    +1

    एंगुलरजेस 1.3 के बाद से नहीं जो मूल रूप से :: सिंटैक्स – masimplo

    +0

    @ mxa055 का उपयोग करके एक बार बाइंडिंग का समर्थन करता है क्या आपने मेरा प्रश्न पढ़ा? ng-if = ":: foo" कुछ भी नहीं करता है। यह अभी भी निरीक्षक के गैज़िलियन बनाता है। – patrick

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