2016-08-17 1 views
0

Ich habe folgenden, sehr vereinfachte Schnipsel:Wie kann man überprüfen, ob die Daten von einem Versprechen zurück ist leer

c.then(function(data){ 
    vm.checkedOut = data; 
}); 

Es wird entweder eine Aufzeichnung zurückzukehren, oder es wird nicht. In jedem Fall gibt das Versprechen ein Objekt zurück - es sind möglicherweise keine Datensatzdaten angehängt.

So weit, so gut. Hier ist meine Frage: Wie kann ich rekordlose Antworten in meinen Ansichten finden?

ich dies tat:

<div ng-if="vm.checkedOut.loaneeName !== undefined"> 
    checked out! 
</div> 

loaneeName eine Eigenschaft des Datensatzes ist, und es wird nicht definiert, wenn kein Datensatz zurückgegeben wird. Irgendwie schlampig, aber es funktioniert.

Allerdings war dies, wie ich das Gegenteil Meldung angezeigt:

<div ng-if="vm.checkedOut.loaneeName === undefined"> 
    not checked out! 
</div> 

Da vm.checkedOut.loaneeName wird immer nicht definiert werden, wenn die Seite geladen wird (und Antworten von dem API warten), die „nicht ausgecheckt! " Die Nachricht erscheint, zumindest für eine Weile, was sehr schlecht sein kann, wenn die Verbindungsgeschwindigkeit langsam genug ist.

c.then(function(data){ 
     vm.checkedOut = data; 
     if(vm.checkedOut.loaneeName === undefined){ 
      vm.forRealsCheckedOut = true; 
     } 
     else { 
      vm.forRealsCheckedOut = false; 
     } 
    }); 

Und dann:

um dieses Problem zu beheben, habe ich folgendes getan

<div ng-if="vm.forRealsCheckedOut === false"> 
    not checked out! 
</div> 
... 

Dies funktioniert, aber es scheint mir auch als etwas grobe Abhilfe für das, was ich davon ausgehen, sollte ein häufiges Problem sein.

Ich bin not die erste Person, die eine Frage so stellen, aber ich habe kein Array and other answers aren't much help.

Gibt es einen besseren Weg?

+0

Sie zumindest vereinfachen könnte ' vm.forRealsCheckedOut = (vm.checkedOut.loaneeName == undefined); 'und' ng-if = "! vm.forRealsCheckedOut" ', aber ansonsten scheint es das zu sein, was Sie wollen. – Bergi

+0

Verwenden Sie ** resize **, bevor Sie den Status laden (führen Sie die API-Anforderung aus und warten Sie, bis sie zurückgegeben wird, bevor Sie die Ansicht rendern). –

Antwort

0

Die Basis Ihres Problems ist, dass, wenn die Verbindung langsam ist, dann das "nicht ausgecheckt!" Nachricht wird angezeigt, bis die Daten geladen sind. Sie müssen erkennen, wann die Daten tatsächlich geladen sind. Sie können das tun, indem geprüft wird, ob vm.checkedOut definiert ist oder nicht:

<div ng-if="vm.checkedOut !== undefined && vm.checkedOut.loaneeName === undefined"> 
    not checked out! 
</div> 

Nur wenn vm.checkedOut definiert und vm.checkedOut.loaneeName definiert werden Sie die „nicht ausgecheckt“ Meldung.

Oder Sie könnten ein Flag-Variable in Ihrer .then() Funktion hinzufügen, das wird die ng-if Aussagen signalisieren, dass die Daten geladen wurden, und sie können für die geladenen Werte beginnen Überprüfung:

$scope.dataLoaded = false; 

c.then(function(data){ 
    vm.checkedOut = data; 
    $scope.dataLoaded = true; 
}); 

<div ng-if="dataLoaded && vm.checkedOut.loaneeName === undefined"> 
    not checked out! 
</div>