2017-06-20 52 views
1

Ich möchte auf ein Objekt zugreifen, das sich in einem anderen Objekt befindet, aber es zeigt 'undefined' an, wenn ich es trenne. BeispielZugriff auf ein Objekt eines anderen Objekts

$scope.instrumento = new Instrumento(); 

$scope.empresaInstrumento = EmpresaInstrumento.get({id:$routeParams.id}, function (instrumento) { 
    $scope.instrumento = instrumento.instrumento; 
    console.log($scope.instrumento); 

}); 
console.log($scope.instrumento); 

Wie kann ich dieses Objekt zu erhalten „instrumento“ aus dem „empresaInstrumento“ ohne seine Referenz zu verlieren?

(die erhalten Methode ruft Informationen von api)

+0

hat Ihre Konsole instrumento und prüfen, ob es instrumento hat? –

+0

ja, es hat. Das "empresaInstrumento" zeigt das Objekt "empresa" und "instrumento". Wenn ich empesaInstrumento.instrumento Konsole Konsole zeigt 'undefined', aber innerhalb dieser Funktion zeigt es richtig das Instrument –

+0

Welche Version von eckigen? Verwendet Ihr Dienst EmpresaInstrumento.get $ http oder ein benutzerdefiniertes Versprechen? – gyc

Antwort

0

Dies liegt daran, die Funktion empresaInstrumento keine Eigenschaft instrumento benannt hat.

Mit diesem gesagt, wäre ein besserer Ansatz, das folgende zu tun;

$scope.instrumento = new Instrumento(); 

$scope.empresaInstrumento = { 
// create an instrumento property 
    instrumento: function() { 
     var toReturn = {}; 
     EmpresaInstrumento.get({id:$routeParams.id}, function (instrumento) { 
      toReturn = instrumento.instrumento; 
     }); 

     return toReturn; 
    } 
} 
console.log($scope.empresaInstrumento.instrumento()); 
1

In Ihrem Code wurde nicht function hatte in der $scope.empresaInstrumento zu laufen, müssen Sie es als function machen und es dann rufen Sie von der Steuerung oder Ansicht als ng-init finden Sie in der Probe

app.controller("ctrl", ["$scope", "EmpresaInstrumento", "$routeParams", function ($scope, empresaInstrumento, routeParams) { 
    $scope.instrumento = {}; 

    $scope.empresaInstrumento = function() { 
     empresaInstrumento.get({ id: routeParams.id }, function (instrumento) { 
      $scope.instrumento = instrumento.instrumento; 
      console.log($scope.instrumento); 
     }); 
    } 

    $scope.empresaInstrumento(); //or in ng-init="empresaInstrumento()" 

    console.log($scope.instrumento); 
}]); 
1

Ich nehme an, Sie sehen nicht, dass der Gültigkeitsbereich in Ihrer HTML-Seite aktualisiert wird, und Sie haben die console.logs hinzugefügt, um zu testen, ob der Wert korrekt gesetzt ist oder nicht.

Sie haben 2 Probleme:

1- Die zweite console.log ausgeführt wird, bevor der API-Aufruf keine Daten zurückgibt. Deshalb wirst du undefiniert. (Das erste Protokoll sollte jedoch den korrekten Wert anzeigen, da es sich innerhalb des Versprechungsblocks befindet.

2- Abhängig davon, wie EmpresaInstrumento.get codiert ist, kann es vorkommen, dass Sie die Bereichswerte mit $ scope. $ aktualisieren müssen apply();

$scope.instrumento = new Instrumento(); 

$scope.empresaInstrumento = EmpresaInstrumento.get({id:$routeParams.id}, function (instrumento) { 
    $scope.instrumento = instrumento.instrumento; 
    console.log($scope.instrumento); 
    $scope.$apply(); // update the scope and your view 
}); 
console.log($scope.instrumento); // still undefined here 

Wenn jedoch die erste console.log undefined zeigt, haben Sie ein Problem mit Ihrem Service und wir müssen sehen, wie sie es zu debuggen codiert ist

+0

Danke! Es scheint angenehmer zu sein, so wie ich es gemacht habe. Ich werde später versuchen, beim Refactoring des Codes –

0

wie Maher dort gesagt, ich. nutzte die lokale Variable, um die Antwort abzufangen, und dann konnte ich diese Information speichern, indem ich eine benannte Funktion innerhalb des Callbacks anrief, um sie an $ zu senden Bereichsvariable, die in der Funktion mithilfe der lokalen Variablen erstellt wurde.

etwas wie folgt aus:

$scope.empresaInstrumento = function() { 
 
     empresaInstrumento.get({ id: routeParams.id }, function (instrumento) { 
 
      $scope.instrumento = instrumento.instrumento; 
 
      $scope.loadInstrumento($scope.instrumento); 
 
     }); 
 
    } 
 
    
 
    
 
    $scope.loadInstrument = function loadInstrument(element) { 
 
     $scope.instrumento = element; 
 
    }

Also, wenn ich diese Informationen anfordern, zeigt sie korrekt in der HTML

Verwandte Themen