2016-08-28 1 views
0

Ich habe eine ngRepeat, die durch eine Liste von Objekten iteriert und zeigt sie an. Diese Objekte enthalten keine Bilder, aber die ID kann zum Abrufen des Bildes verwendet werden. Im Inhalt von ngRepeat möchte ich das Bild anzeigen, das dem Objekt entspricht, und so rufe ich eine Funktion innerhalb einer ngSource auf, um das Bild zu erhalten, das dem aktuellen Objekt entspricht. Die ngSource kann jedoch nicht auf der aktuellen Seite geladen werden.Ng-src keine Funktion vom Bereich aufrufen

HTML:

<div class="list-group"> 
    <a ng-click="courseSelected(course.course_id)" class="list-group-item" ng-repeat="course in searchResultData.courseList" id="searchResults"> 
    <div> 
     <img ng-src="{{getLogoByCourse(course)}}"/> 
     <h4 class="list-group-item-heading">{{course.name}}, {{course.city}}, {{course.state}}</h4> 
     <p class="list-group-item-text miscData" ng-show="course.price"><span>Price: {{course.price}}</span></p> 
     <p class="list-group-item-text miscData"> 
      <span>Phone number: {{course.phone}}</span><br/> 
      <span>Address: {{course.address}}</span><br/> 
      <span>Website: {{course.website}}</span> 
     </p> 
    </div> 
    </a> 
</div> 

Richtlinie Snippet:

$scope.getLogoByCourse = function(course) { 
    console.log("Getting logo"); 
    courseFactory.getLogoByID(course.course_id) 
     .then(function(result){ 
      console.log("logo: ", result); 
      result = "app/images/directory/" + result.data[0]; 
      return result; 
     } 
    ); 
} 

$scope.getImageByCourse = function(course) { 
    courseFactory.getImagesByID(course.course_id) 
     .then(function(result){ 
      console.log("Image: ", result); 
      result = "app/images/directory/" + result.data[0]; 
      return result; 
     } 
    ); 
} 

Inhalt des Bild-Tag auf geladenen Seite:

<img class="logo-img"> 
+0

Sind im Steuerungsbereich die Funktionen erklärt? Wenn sie im Direktivenbereich deklariert sind, sehe ich im HTML keine benutzerdefinierte Direktive. –

+0

Entschuldigung, der HTML-Code wird in der View von der Direktive geladen, und die Funktionen werden im Linkfeld der Direktive deklariert. Ich bin ziemlich sicher, dass es der richtige Ort ist, da andere Funktionen an der gleichen Stelle erfolgreich aus dem HTML aufgerufen werden. –

+0

Es sollte gut funktionieren. Ich verstehe nicht, wo es bricht. Können Sie ein schnelles, kleines jsFiddle-Beispiel für Ihr Format erstellen? –

Antwort

2

Das Problem ist, dass $scope.getLogoByCourse eigentlich nichts zurück. Es sieht so aus, als ob Sie versuchen, einen Wert aus einem Versprechen zurückzugeben, aber da das asynchron zurückkommt, erhalten Sie immer undefined als Rückgabewert von $scope.getLogoByCourse.

Sie möchten möglicherweise alle URLs gleichzeitig abrufen und sie in ein Array laden. Dann können Sie jede URL in der ng-repeat mit der $index Variable anhängen.

$scope.logos = []; 

for (var i = 0; i < searchResultData.courseList.length; i++) { 
    (function (j) { 
     var course = searchResultData.courseList[j]; 
     courseFactory.getImagesByID(course.course_id) 
      .then(function (result) { 
       console.log("Image: ", result); 
       result = "app/images/directory/" + result.data[0]; 
       $scope.logos[j] = result; 
       $scope.$apply(); 
      }, function (error) { 
       $scope.logos[j] = null; 
      }); 
    )(i); 
} 

Dann in Ihrer Vorlage:

<img ng-src="{{ logos[$index] }}" /> 
+0

Wenn ich dies verwende, kommt das Logo zu http://puu.sh/qRUqr/4394994153.png, aber das Konsolenprotokoll, das das Bild ausgibt, erzeugt die korrekten Ergebnisse. –

+0

Nevermind, das behoben. Die URL erscheint jedoch immer noch nicht auf dem geladenen HTML. –

+0

Haben Sie eine JSFiddle? –

Verwandte Themen