2014-07-07 8 views
15

का उपयोग कर फ़ॉलबैक (डिफ़ॉल्ट) छवि मैं एक मोडल से लौटाए गए डेटा का उपयोग करके एक छवि स्रोत सेट करने का प्रयास कर रहा हूं। यह एक एनजी-दोहराने पाश अंदर है:कोणीय JS ng-src

<div id="divNetworkGrid"> 
    <div id="{{network.id}}" ng-repeat="network in networks"> 
     <span> 
      <table> 
       <tr> 
        <td class="imgContainer"> 
         <img ng-src="{{ ('assets/img/networkicons/'+ network.actual + '.png') || 
             'assets/img/networkicons/default.png' }}"/> 
        </td> 
       </tr> 
      </table> 
     </span> 
    </div> 
</div> 

के रूप में स्पष्ट है, मैं default.png को भरने के लिए जब network.actual मॉडल संपत्ति अशक्त के रूप में दिया जाता है चाहता हूँ। लेकिन मेरा कोड डिफ़ॉल्ट छवि नहीं उठा रहा है, हालांकि उपलब्ध होने पर पहली छवि ठीक हो रही है।

मुझे यकीन है कि यह कुछ वाक्यविन्यास मुद्दा है, लेकिन यह पता नहीं लगा कि क्या गलत है।

+0

मैंने अक्सर सोचा है कि यह कैसे करें और आपके जैसी चीजों की कोशिश की है, लेकिन यह कभी काम नहीं कर रहा था! अच्छा प्रश्न! – SM3RKY

उत्तर

10

ng-src का उपयोग करने का दिलचस्प तरीका। मैं परीक्षण किया है नहीं कैसे कि अभिव्यक्ति हैंडल किया जाएगा लेकिन मैं इसे एक अधिक स्थिर तरीका कर रही सुझाव है:

<img ng-src="{{ networkIcon }}" /> 

और अपने नियंत्रक में:

$scope.networkIcon = network.actual ? 'assets/img/networkicons/' + network.actual + '.png' : 'assets/img/networkicons/default.png'; 

संपादित करें: बस स्पष्ट करने के लिए, मैं ऐसा करने का सबसे अच्छा तरीका यह नहीं है कि छवि स्रोत को सीधे दायरे में बांधना है, बल्कि दृश्य के बाहर छवि फ़ॉलबैक तर्क को स्थानांतरित करना है। मेरे अनुप्रयोगों में मैं अक्सर उन सेवाओं में करता हूं जो डेटा को या सर्वर पर पुनर्प्राप्त करते हैं और एक छवि यूआरएल भेजते हैं ताकि क्लाइंट को केवल एक ही संपत्ति के बारे में चिंता करनी पड़े। पुनरावर्तक को संबोधित करने के

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

angular.forEach($scope.networks, function(network) { 
    network.icon = network.actual ? 'assets/img/networkicons/' + network.actual + '.png' : 'assets/img/networkicons/default.png'; 
}); 

<tr ng-repeat="network in networks"> 
    <td><img ng-src="{{ network.icon }}" /></td> 
</tr> 
+1

मुझे पहले निर्दिष्ट करना चाहिए था, लेकिन network.actual वास्तव में एक ng-repeat के भीतर है। नेटवर्क नेटवर्क मॉडल का पुनरावृत्ति है।तो यह विकल्प मेरे लिए काम नहीं करेगा, दुर्भाग्य से ... – nikjohn

+0

हां यह मेरे संपादन पैराग्राफ में मैंने उल्लेख किया है कि मैं इसे उन सेवाओं में करता हूं जो डेटा पुनर्प्राप्त करते हैं। तो इससे पहले कि आप अपने डेटा के माध्यम से पुनरावर्तक को बाध्य करें और छवि स्रोत को प्रतिस्थापित करें (या संलग्न करें)। – Terry

+0

मैंने अपना उत्तर दोहराने से पहले डेटा को संशोधित करने के उदाहरण के साथ अपडेट किया है। – Terry

14
angular.module('fallback',[]).directive('fallbackSrc', function() { 
    return{ 
     link: function postLink(scope, element, attrs) { 
      element.bind('error', function() { 
       angular.element(this).attr("src", attrs.fallbackSrc); 
      }); 
     } 
    } 
}); 

<img ng-src="{{url}}" fallback-src="default-image.jpg"/> 

angular.module('fallback', []).directive('actualSrc', function() { 
    return{ 
     link: function postLink(scope, element, attrs) { 
      attrs.$observe('actualSrc', function(newVal, oldVal){ 
       if(newVal != undefined){ 
        var img = new Image(); 
        img.src = attrs.actualSrc; 
        angular.element(img).bind('load', function() { 
         element.attr("src", attrs.actualSrc); 
        }); 
       } 
      }); 

     } 
    } 
}); 

<img actual-src="{{url}}" ng-src="default.jpg"/> 

link

+0

मैं शुरुआत में इसे आजमाने के लिए अनिच्छुक था क्योंकि मैंने सोचा था कि यह एक आसान समाधान होना चाहिए। हालांकि, मैंने कई सुझावों की कोशिश करने के बाद और उनमें से कोई भी पूरी तरह से काम नहीं करने के बाद, यह निश्चित रूप से सबसे अच्छा है। धन्यवाद! – newman

+0

@ मिलिउ ग्लेड ने आपकी मदद की :) –

+1

मामूली त्रुटि: पहला उदाहरण फॉलबैक-src का उपयोग विशेषता एचटीएमएल कोड (या निर्देशक नाम के रूप में fallBackSrc) के रूप में करना चाहिए। महान समाधान अन्यथा! – wal5hy

8
<div id="divNetworkGrid"> 
       <div id="{{network.id}}" ng-repeat="network in networks"> 
        <span> 
         <table> 
          <tr> 
           <td class="imgContainer"> 
            <img ng-src="{{'assets/img/networkicons/'+(network.actual || 'default')+'.png'}}"/> 
           </td> 
          </tr> 
         </table> 
        </span> 
       </div> 
      </div> 

इनलाइन या यदि पूछे चर अपरिभाषित है काम करेंगे। ऊपर अपनी समस्या

30

ठीक कर देंगे मैं सिर्फ बाहर पाया है, कि आप एक img टैग पर ng-src और src दोनों का उपयोग कर सकते हैं और यदि ng-src विफल रहता है (चर प्रयुक्त आदि मौजूद नहीं है), यह स्वतः ही src विशेषता पर वापस आने जाएगा।

+3

मुझे लगता है कि अगर आप अधिक कोड लिखना नहीं चाहते हैं तो समाधान बेहतर है। – Parijat

13

मुझे क्या लगता है कि यह हो रहा है कि स्रोत 404 लौटा रहा है भले ही network.actual शून्य हो। उदाहरण के लिए, पहले मूल्य:

('assets/img/networkicons/'+network.actual+'.png')

404 src यूआरएल के लिए मूल्यांकन कर रही है, जैसे कुछ ('संपत्ति/img/networkicons/अशक्त .png')। - http://codepen.io/jpost-vlocity/pen/zqqerL

+1

यह सही है अगर + network.actual + var मौजूद है लेकिन छवि नहीं है! – Fergus

+0

मेरे लिए सबसे अच्छा समाधान –

+0

स्वच्छ, सरल और साफ। अच्छा काम करता है। –

3

<img ng-src="{{('assets/img/networkicons/'+network.actual+'.png')}}" onerror="this.src='assets/img/networkicons/default.png'" /> 

CodePen उपयोग के मामलों डेमो के लिए: तो या चयन में, यह सच-y है, लेकिन संसाधन 404. है उस मामले में, आप की तरह कुछ के साथ onError के माध्यम से वापस आने सेट कर सकते हैं आप या उसके बाद ऑपरेटर के बाद वैकल्पिक छवि की आपूर्ति कर सकते हैं:

{{ book.images.url || 'Images/default.gif' }}