Angularjs routeScope változó undefined
2018-12-03T02:35:26+01:00
2018-12-09T10:19:17+01:00
2022-08-18T22:40:44+02:00
gabeszba
Sziasztok!
Kezdő vagyok Angularjs-ben. A következő lenne a problémám. Szeretnék egy json tömbből $http.get-tel átadni controllernek adatot.
Az a baj, hogy az async miatt mindig undefined megy át és egész egyszerűen nem tudok rájönni, hol rontom el...

app.run(function($rootScope, commonService) { var promise = commonService.test(); promise.then( function(payload) { console.log(payload.data); $rootScope.listingData = payload.data; }, function(errorPayload) { console.log('ehhh'); }); }); app.factory('commonService', ['$http', function ($http) { return { test: function() { return $http.get('common/angular/test.json'); } }; }]);
A console.log(payload.data)-ban benne van a tömb, de a $rootScope.listingData = payload.data-ban már nincs. Tudna valaki segíteni?
Előre is köszönöm!
Mutasd a teljes hozzászólást!
De a controller-ben még nem tudhatod, hogy a promise teljesült-e.
Ez egy aszinkron kérés, az app.run-ban elindítod és majd lefut valamikor.
Amikor a controller inicializálódik, még semmi garancia arra, hogy lefutott.

Ezért javasoltuk itt többen, hogy vagy a service-t, vagy a promise-t magát add át a controllernek, majd a then()-ben csináld, amit a service-tól várt adattal szeretnél csinálni.

Valahogy így (nem teszteltem, csak az elv bemutatására szolgál):

module.controller( 'myController', function( $scope, commonService ) { $scope.listingData = null; commonService.test().then( function( payload ) { $scope.listingData = payload.data; // Itt mehet, amit a listingData-val akarsz csinálni! }, function() { console.log( 'commonService.test error' ); } ); } );
Mutasd a teljes hozzászólást!

  • Szerintem ennek jónak kéne lennie. Talán a visszakapott adattal lehet valami gond.

    AngularJS Online - Test your code on the web - JSFiddle
    Mutasd a teljes hozzászólást!
  • Az nem látszik a kódban, hogy a $rootScope.listingData-t hol próbálod használni. Nem lehet, hogy még a promise teljesülése előtt? Mert ha a $rootScope.listingData = payload.data; sor után kiíratod, ott lesz az.
    Mutasd a teljes hozzászólást!
  • A controllernek szeretném átadni, és az nem akar összejönni. Valahogy így...
    Biztosan az a baj, hogy még a promise előtt, csak nem tudom, hogy tudnám figyelni...

    module.controller("myController", function($scope, $rootScope) { //... $scope.message = $scope.listingData; });
    Mutasd a teljes hozzászólást!
  • Miért nem a commonService-t adod át a controllernek és commonService.test().then()-ben kezded el használni?
    Egyébként lehet $scope.$watch-ot (vagy a te esetedben $rootScope.$watch-ot) használni arra, hogy figyeld a listingData változását. De ezt nem javaslom, mert ha túltolod (sok $watch fut), akkor hamar a teljesítmény rovására megy.

    Esetleg még érdemes lehet megnézni az angular ui-router-t is. Ott szépen megoldották, hogy egy-egy state-hez fel lehet sorolni, hogy milyen "függőségei" vannak. És amikor minden promise teljesült, akkor indul a controller kód.
    Mutasd a teljes hozzászólást!
  • Watch-ot én se szeretnék használni, a Te általad említett ok miatt.
    Próbáltam a commonService-t is átadni. Írtam, hogy kezdő vagyok, így lehet, félreérthető volt a leírásom, elnézést. A view-ban jó a $scope. Viszont én controlleren belül szeretnék hivatkozni rá.
    És az nem megy...
    Mutasd a teljes hozzászólást!
  • Így nyilván nem fog menni, hiszen a $rootScope.listingData kap értéket és nem a $scope.listingData. Mivel a promise még nem oldódott fel, nyilván nem lehet felelőtlenül hivatkozni rá, hanem meg kell adni neki egy alapértelmezett értéket:

    AngularJS Online - Test your code on the web - JSFiddle

    Akkor tudsz vele dolgozni, amikor a promise "feloldódott".  De átadhatod a promiset is. És szerintem nem biztos hogy annyira félni kell attól a watchtól.
    Mutasd a teljes hozzászólást!
  • Nem a promise.then(...) oldja fel a promise-t?
    Én úgy "számolok vele", hogy itt adhatom át a $rootScope változónak a $http.get eredményét.
    És utána ha egy controllerbe meghívom a $rootScope-ot, akkor tudok dolgozni az adott változóval. Tuti itt bukom el...
    Mutasd a teljes hozzászólást!
  • De a controller-ben még nem tudhatod, hogy a promise teljesült-e.
    Ez egy aszinkron kérés, az app.run-ban elindítod és majd lefut valamikor.
    Amikor a controller inicializálódik, még semmi garancia arra, hogy lefutott.

    Ezért javasoltuk itt többen, hogy vagy a service-t, vagy a promise-t magát add át a controllernek, majd a then()-ben csináld, amit a service-tól várt adattal szeretnél csinálni.

    Valahogy így (nem teszteltem, csak az elv bemutatására szolgál):

    module.controller( 'myController', function( $scope, commonService ) { $scope.listingData = null; commonService.test().then( function( payload ) { $scope.listingData = payload.data; // Itt mehet, amit a listingData-val akarsz csinálni! }, function() { console.log( 'commonService.test error' ); } ); } );
    Mutasd a teljes hozzászólást!
  • Szia!
    Elnézést a késői válaszért! Meg kellett emésztenem!
    A service került bele a controller(ek)-be, így használom. A $watch, bár jó erre, de véleményem szerint mégsem erre találták ki... Ezt még tanulgatom.
    A lényeg, hogy megértettem, és köszönöm a segítséget mindenkinek!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd