2017-01-11 4 views
0

Ich muss die von $http.get zurückgegebenen Daten in einer $scope Variable speichern, die von meiner ui-grid Steuerung verwendet werden soll.

Ich bin mir sicher, ich vermisse etwas sehr einfaches, aber ich kann nicht herausfinden, was. Hier ist mein Code:

app.controller('AdminUsersGridCtrl', function ($scope, $http, uiGridConstants) { 

    $http.get('/api/admin/user') 
    .success(function (response, $scope) { 
     $scope.myData = response; 
    }) 
    .error(function (error) { 
     console.log(error); 
    }); 

    console.log($scope.myData); 

    $scope.gridOptions = { 
     data: 'myData', 
     enableFiltering: true, 
     columnDefs: [ 
     { field: 'firstName' }, 
     { field: 'lastName' }, 
     { field: 'jobTitle'}, 
     { 
      field: 'email', 
      filter: { 
      condition: uiGridConstants.filter.ENDS_WITH, 
      placeholder: 'ends with' 
      } 
     }, 
     { 
      field: 'phone', 
      filter: { 
      condition: function(searchTerm, cellValue) { 
       var strippedValue = (cellValue + '').replace(/[^\d]/g, ''); 
       return strippedValue.indexOf(searchTerm) >= 0; 
      } 
      } 
     }, 
     ] 
    };   

    }); 

Meine Konsole innerhalb Erfolg druckt undefined. Wie kann ich auf das Original $scope innerhalb der $http.get success Funktion zugreifen?

+3

Sie haben Zugriff darauf, es ist nur, dass der Rest Ihres Codes vor dem 'Erfolg' ausgeführt wird, weil AJAX = asynchron! Verschieben Sie Ihren Code an den Rückruf – tymeJV

+1

, wenn Ihre Konsole die Bereichsvariable myData protokolliert. Sie ist in der Tat ** undefiniert **, da Sie immer noch eine ** asynchrone http-get-Anforderung ** ausführen. Wenn Sie "myData" an die gridOptionen binden müssen und 100% sicher sein wollen, dass es korrekt geladen und fehlerfrei ist, parsen Sie Ihren Code im ** .erfolgreich ** -Rückruf, oder erstellen Sie ein 'Versprechen' und lösen Sie ihn Sobald die HTTP-Anfrage abgeschlossen ist. – briosheje

Antwort

1
My console inside success prints undefined 

Aber Ihre Konsole ist nicht in der Erfolgsmethode. Dies ist im Inneren:

$http.get('/api/admin/user') 
.success(function (response) { 
    $scope.myData = response; 
    console.log($scope.myData); 
}) 
.error(function (error) { 
    console.log(error); 
}); 

Dies ist nicht:

// order of events.. 
// #1...first $http 
$http.get('/api/admin/user') 
.success(function (response) { 
    //... #3 third. Now finally response is defined. the end 
    $scope.myData = response; 
}) 
.error(function (error) { 
    console.log(error); 
}); 

//... #2 second. $scope.myData definitely IS undefined 
console.log($scope.myData); 

riesiger Unterschied. Es ist auch nicht notwendig, $scope in Ihrem Erfolgsrückruf einzubeziehen. Das habe ich noch nie zuvor gesehen. Woher hast du das?

+0

Offensichtlich. Vielen Dank. Aber der $ scope, auf den ich innerhalb der Erfolgsfunktion zugreifen werde, wird der ursprüngliche sein (closure)? – Mendes

+0

Es spielt keine Rolle. Angular verwendet einen Digest-Zyklus, um die Ansicht für asynchrone Ereignisse zu aktualisieren, wobei "$ http" zufällig –

+0

ist. Wenn Sie den Bereich basierend auf einem Ereignis ändern, das angular nicht bekannt ist (kein häufiger Anwendungsfall), müssten Sie dies tun machen Sie sich darüber Gedanken und führen Sie den Digest-Zyklus manuell aus. –

0

Wenn ein Server-Aufruf besser ist, wenn Sie einen Dienst in einer externen Datei verwenden, aber in Ihrem Fall hat der $ -Scope keine Antwort, da der Code ausgeführt wird, bevor der Dienst beendet wurde, versuchen Sie es mit $ Timeout oder etwas ähnliches:

app.controller('AdminUsersGridCtrl', function ($scope, $http, uiGridConstants) { 

$http.get('/api/admin/user').success(function (response) { 
    $scope.myData = response; 
    fillGridOptions(); 
}).error(function (error) { 
    console.log(error); 
}); 

function fillGridOptions() { 
$scope.gridOptions = { 
    data: 'myData', 
    enableFiltering: true, 
    columnDefs: [ 
     { field: 'firstName' }, 
     { field: 'lastName' }, 
     { field: 'jobTitle' }, 
     { 
      field: 'email', 
      filter: { 
       condition: uiGridConstants.filter.ENDS_WITH, 
       placeholder: 'ends with' 
      } 
     }, 
     { 
      field: 'phone', 
      filter: { 
       condition: function (searchTerm, cellValue) { 
        var strippedValue = (cellValue + '').replace(/[^\d]/g, ''); 
        return strippedValue.indexOf(searchTerm) >= 0; 
       } 
      } 
     }, 
    ] 
}; 

}

});

Verwandte Themen