2015-12-22 48 views
1

問題是與此同時我試圖檢查資源服務器上是否存在一個圖像,Angular NgFor正在執行其工作。無限循環與JavaScript(Angular NgFor和http請求)

我可以猜測,img.src執行請求,然後我的回調在回調中沒有像預期的那樣返回,事實上,defaultPrincipalUrl方法沒有像預期的那樣返回任何東西,因此Angular再次執行相同的請求,再次。

但是,我不知道在Javascript中解決它的方式。

html中的NgFor看起來像這樣。

<div class="formItem"> 
    <div *ng-for="#principal of localService.defaultPrincipals"> 
     <img src="{{defaultPrincipalUrl(principal)}}" /> 
    </div> 
</div> 

其中localService.defaultPrincipals是一個包含圖像名稱的數組。

在Angular2 @Component類中,我有下一個實現。

private imageExists(imageSrc, callback) { 

    var img = new Image(); 

    img.onload = function() { callback(imageSrc, true); }; 
    img.onerror = function() { callback(imageSrc, false); }; 

    img.src = imageSrc; 
} 

defaultPrincipalUrl(principal) { 

    var im = IMAGE_DOMAIN + '/principal/' + principal; 

    console.log(im); 

    this.imageExists(im, function (imageSrc, exists) { 

     console.log('RESULT: url=' + imageSrc + ', exists=' + exists); 

     if (exists) { 

      return imageSrc; 
     } else { 

      return '#'; 
     } 
    }); 
} 
+0

defaultPrincipalUrl沒有返回值。通過調用回調函數的返回值將不會傳播(這也是一個異步回調)。 –

回答

2

使用異步管。

<div class="formItem"> 
    <div *ng-for="#principal of localService.defaultPrincipals"> 
     <img src="{{defaultPrincipalUrl(principal) | async}}" /> 
    </div> 
</div> 

defaultPrincipalUrl的結果必須是一個承諾,因爲回調是異步:

private imageExists(imageSrc, callback) { 

    var img = new Image(); 

    img.onload = function() { callback(imageSrc, true); }; 
    img.onerror = function() { callback(imageSrc, false); }; 

    img.src = imageSrc; 
} 

defaultPrincipalUrl(principal) { 

    var im = IMAGE_DOMAIN + '/principal/' + principal; 

    console.log(im); 

    let self_ = this; 

    return new Promise(function(resolve, reject) { 

    self_.imageExists(im, function (imageSrc, exists) { 

     console.log('RESULT: url=' + imageSrc + ', exists=' + exists); 

     if (exists) { 
      resolve(imageSrc); 
     } else { 
      resolve('#'); 
     } 
    }); 


    }); 

} 
+0

Ty爲您的答案Mourad Zouabi,我一直在尋找類似於您的貢獻的東西,與Promises或其他人合作;)。但是,令人驚訝的是,行爲是相同的,無限循環執行。如果你想我可以更新#1,但代碼看起來像你張貼。 – Dani

+0

有關更多信息,我正在使用「2.0.0-alpha.46」,認爲功能在該版本上可能出錯,我已升級到「2.0.0-beta.0」,但尚未有任何改進。 – Dani