-1

I have ng-controller

groupifyApp.controller('DashboardCtrl', function ($rootScope, $scope, $routeParams, $route, $http) {
$scope.page = {title:"Preferences", dashboardActive: "active", manageActive: "", inboxActive:"", preferencesActive:""};
$scope.user = {};
//$scope.user = {"name":"Test User","cal":{"entries":[{"id":0,"day":0,"start":1.25,"duration":1.0},{"id":1,"day":0,"start":4.0,"duration":1.75},{"id":2,"day":0,"start":4.75,"duration":0.5},{"id":3,"day":0,"start":5.75,"duration":0.75},{"id":4,"day":0,"start":6.5,"duration":0.25},{"id":5,"day":0,"start":7.5,"duration":0.25},{"id":6,"day":0,"start":9.5,"duration":1.75},{"id":7,"day":0,"start":10.75,"duration":0.5},{"id":8,"day":0,"start":11.75,"duration":0.75},{"id":9,"day":1,"start":0.75,"duration":0.5},{"id":10,"day":1,"start":1.25,"duration":0.25},{"id":11,"day":1,"start":2.0,"duration":0.5},{"id":12,"day":1,"start":2.75,"duration":0.5},{"id":13,"day":1,"start":3.5,"duration":0.25},{"id":14,"day":1,"start":4.5,"duration":0.5},{"id":15,"day":1,"start":6.5,"duration":1.5},{"id":16,"day":1,"start":7.75,"duration":0.75},{"id":17,"day":1,"start":8.25,"duration":0.25},{"id":18,"day":1,"start":11.25,"duration":0.5},{"id":19,"day":2,"start":0.0,"duration":0.25},{"id":20,"day":2,"start":1.25,"duration":0.75},{"id":21,"day":2,"start":1.75,"duration":0.25},{"id":22,"day":2,"start":2.5,"duration":0.5},{"id":23,"day":2,"start":4.25,"duration":1.25},{"id":24,"day":2,"start":5.75,"duration":0.75},{"id":25,"day":2,"start":6.75,"duration":0.75},{"id":26,"day":2,"start":7.75,"duration":0.75},{"id":27,"day":2,"start":9.0,"duration":1.0},{"id":28,"day":2,"start":9.75,"duration":0.25},{"id":29,"day":2,"start":10.75,"duration":0.5},{"id":30,"day":3,"start":0.25,"duration":0.5},{"id":31,"day":3,"start":0.75,"duration":0.25},{"id":32,"day":3,"start":1.25,"duration":0.25},{"id":33,"day":3,"start":2.5,"duration":0.5},{"id":34,"day":3,"start":3.5,"duration":0.75},{"id":35,"day":3,"start":4.0,"duration":0.25},{"id":36,"day":3,"start":4.75,"duration":0.5},{"id":37,"day":3,"start":5.5,"duration":0.5},{"id":38,"day":3,"start":6.0,"duration":0.25},{"id":39,"day":3,"start":6.5,"duration":0.25},{"id":40,"day":3,"start":7.25,"duration":0.25},{"id":41,"day":3,"start":8.0,"duration":0.5},{"id":42,"day":3,"start":8.5,"duration":0.25},{"id":43,"day":3,"start":9.5,"duration":0.75},{"id":44,"day":3,"start":10.75,"duration":0.5},{"id":45,"day":3,"start":11.25,"duration":0.25},{"id":46,"day":3,"start":11.75,"duration":0.25},{"id":47,"day":4,"start":1.5,"duration":1.5},{"id":48,"day":4,"start":2.0,"duration":0.25},{"id":49,"day":4,"start":3.25,"duration":0.5},{"id":50,"day":4,"start":4.0,"duration":0.25},{"id":51,"day":4,"start":4.75,"duration":0.25},{"id":52,"day":4,"start":7.25,"duration":2.0},{"id":53,"day":4,"start":7.75,"duration":0.25},{"id":54,"day":4,"start":8.25,"duration":0.25},{"id":55,"day":4,"start":9.75,"duration":0.75},{"id":56,"day":4,"start":11.0,"duration":0.25}]},"age":-1900,"username":"testUser","id":0};
$scope.user = function() { return getFullUser($http)};

alert(JSON.stringify($scope.user));

});

And a function

function getFullUser($http) {
return
    $http({method: "GET", url: "api/user", headers: {
        'Content-Type': 'application/json', 'token': localStorage.token}})
          .success(function(data) {
              return data;
          });

}

I found a similar question hereenter link description here But could not map its solutions to my problem

When $scope.user is retrived by my getFullUser function it gets undefined. When I use the static Object (the commented out line) it works properly.

But response.data is the same as the static version. I compared its structure with JSON.stringify(response.data)

Do you have any idea why $scope.user remains undefined?

The function and the controller are in 2 different files and I do not want to merge them together.

So duplicate answers do not help.

Thanks

Community
  • 1
  • 1
1elf
  • 23
  • 4
  • What you have basically done is set $scope.user to a function which returns nothing (hence undefined). What you want to do is return the $http (which is a promise object) and use the callback in the controller – RSquared Jan 28 '15 at 01:01

2 Answers2

1

You have several problems.

  1. I don't think your code really is what you posted. Regardless of what other problems you have, the posted code defines the variable $http.
  2. You are setting $scope.user not to a user (as the commented-out code would), not to a promise to fetch a user (which would be sensible), but to a function that will return a promise to fetch a user.

Re-examine your code to find out where you misplaced some curly-brackets.

Michael Lorton
  • 43,060
  • 26
  • 103
  • 144
0

So after some hours reading about AJAX calls and asynchronous programming, I figured it out. I leave it here for anybody who might get stuck as well. Thanks again to @PSL for getting me on the right track.

After a while and trying to solve my Problem I ended up with this:

groupifyApp.controller('DashboardCtrl', function ($rootScope, $scope, $routeParams, $route, $http) {
$scope.page = {title:"Preferences", dashboardActive: "active", manageActive: "", inboxActive:"", preferencesActive:""};
$scope.user = {};
//$scope.user = {"name":"Test User","cal":{"entries":[{"id":0,"day":0,"start":1.25,"duration":1.0},{"id":1,"day":0,"start":4.0,"duration":1.75},{"id":2,"day":0,"start":4.75,"duration":0.5},{"id":3,"day":0,"start":5.75,"duration":0.75},{"id":4,"day":0,"start":6.5,"duration":0.25},{"id":5,"day":0,"start":7.5,"duration":0.25},{"id":6,"day":0,"start":9.5,"duration":1.75},{"id":7,"day":0,"start":10.75,"duration":0.5},{"id":8,"day":0,"start":11.75,"duration":0.75},{"id":9,"day":1,"start":0.75,"duration":0.5},{"id":10,"day":1,"start":1.25,"duration":0.25},{"id":11,"day":1,"start":2.0,"duration":0.5},{"id":12,"day":1,"start":2.75,"duration":0.5},{"id":13,"day":1,"start":3.5,"duration":0.25},{"id":14,"day":1,"start":4.5,"duration":0.5},{"id":15,"day":1,"start":6.5,"duration":1.5},{"id":16,"day":1,"start":7.75,"duration":0.75},{"id":17,"day":1,"start":8.25,"duration":0.25},{"id":18,"day":1,"start":11.25,"duration":0.5},{"id":19,"day":2,"start":0.0,"duration":0.25},{"id":20,"day":2,"start":1.25,"duration":0.75},{"id":21,"day":2,"start":1.75,"duration":0.25},{"id":22,"day":2,"start":2.5,"duration":0.5},{"id":23,"day":2,"start":4.25,"duration":1.25},{"id":24,"day":2,"start":5.75,"duration":0.75},{"id":25,"day":2,"start":6.75,"duration":0.75},{"id":26,"day":2,"start":7.75,"duration":0.75},{"id":27,"day":2,"start":9.0,"duration":1.0},{"id":28,"day":2,"start":9.75,"duration":0.25},{"id":29,"day":2,"start":10.75,"duration":0.5},{"id":30,"day":3,"start":0.25,"duration":0.5},{"id":31,"day":3,"start":0.75,"duration":0.25},{"id":32,"day":3,"start":1.25,"duration":0.25},{"id":33,"day":3,"start":2.5,"duration":0.5},{"id":34,"day":3,"start":3.5,"duration":0.75},{"id":35,"day":3,"start":4.0,"duration":0.25},{"id":36,"day":3,"start":4.75,"duration":0.5},{"id":37,"day":3,"start":5.5,"duration":0.5},{"id":38,"day":3,"start":6.0,"duration":0.25},{"id":39,"day":3,"start":6.5,"duration":0.25},{"id":40,"day":3,"start":7.25,"duration":0.25},{"id":41,"day":3,"start":8.0,"duration":0.5},{"id":42,"day":3,"start":8.5,"duration":0.25},{"id":43,"day":3,"start":9.5,"duration":0.75},{"id":44,"day":3,"start":10.75,"duration":0.5},{"id":45,"day":3,"start":11.25,"duration":0.25},{"id":46,"day":3,"start":11.75,"duration":0.25},{"id":47,"day":4,"start":1.5,"duration":1.5},{"id":48,"day":4,"start":2.0,"duration":0.25},{"id":49,"day":4,"start":3.25,"duration":0.5},{"id":50,"day":4,"start":4.0,"duration":0.25},{"id":51,"day":4,"start":4.75,"duration":0.25},{"id":52,"day":4,"start":7.25,"duration":2.0},{"id":53,"day":4,"start":7.75,"duration":0.25},{"id":54,"day":4,"start":8.25,"duration":0.25},{"id":55,"day":4,"start":9.75,"duration":0.75},{"id":56,"day":4,"start":11.0,"duration":0.25}]},"age":-1900,"username":"testUser","id":0};
getFullUser($http, $scope.user);
//$scope.slots = $scope.user.slots;

alert(JSON.stringify($scope.user));

});

And my function

function getFullUser($http, user) {
    $http({method: "GET", url: "api/user", headers: {
        'Content-Type': 'application/json', 'token': localStorage.token}})
          .then(function(result) {
              user = result.data;
              alert(JSON.stringify(user));
          });

}

Note that they are both in 2 different files, so just calling $scope.user = result.data; was not an option.

I wasn't really sure how this could even work, because in other programming languages such as C#, Java, etc. my getFullUser function would change its variable user only in its own scope and nothing would have happened outside.

Then after reading about callbacks and other solutions I came up with the idea not to hand over a variable such as user, but to hand over a function setUserCallback that will be executed when the result ist fetched from my RestService.

So I ended up with this (which works just fine):

groupifyApp.controller('DashboardCtrl', function ($rootScope, $scope, $routeParams, $route, $http) {
    $scope.page = {title:"Preferences", dashboardActive: "active", manageActive: "", inboxActive:"", preferencesActive:""};
    $scope.user = {};
    //$scope.user = {"name":"Test User","cal":{"entries":[{"id":0,"day":0,"start":1.25,"duration":1.0},{"id":1,"day":0,"start":4.0,"duration":1.75},{"id":2,"day":0,"start":4.75,"duration":0.5},{"id":3,"day":0,"start":5.75,"duration":0.75},{"id":4,"day":0,"start":6.5,"duration":0.25},{"id":5,"day":0,"start":7.5,"duration":0.25},{"id":6,"day":0,"start":9.5,"duration":1.75},{"id":7,"day":0,"start":10.75,"duration":0.5},{"id":8,"day":0,"start":11.75,"duration":0.75},{"id":9,"day":1,"start":0.75,"duration":0.5},{"id":10,"day":1,"start":1.25,"duration":0.25},{"id":11,"day":1,"start":2.0,"duration":0.5},{"id":12,"day":1,"start":2.75,"duration":0.5},{"id":13,"day":1,"start":3.5,"duration":0.25},{"id":14,"day":1,"start":4.5,"duration":0.5},{"id":15,"day":1,"start":6.5,"duration":1.5},{"id":16,"day":1,"start":7.75,"duration":0.75},{"id":17,"day":1,"start":8.25,"duration":0.25},{"id":18,"day":1,"start":11.25,"duration":0.5},{"id":19,"day":2,"start":0.0,"duration":0.25},{"id":20,"day":2,"start":1.25,"duration":0.75},{"id":21,"day":2,"start":1.75,"duration":0.25},{"id":22,"day":2,"start":2.5,"duration":0.5},{"id":23,"day":2,"start":4.25,"duration":1.25},{"id":24,"day":2,"start":5.75,"duration":0.75},{"id":25,"day":2,"start":6.75,"duration":0.75},{"id":26,"day":2,"start":7.75,"duration":0.75},{"id":27,"day":2,"start":9.0,"duration":1.0},{"id":28,"day":2,"start":9.75,"duration":0.25},{"id":29,"day":2,"start":10.75,"duration":0.5},{"id":30,"day":3,"start":0.25,"duration":0.5},{"id":31,"day":3,"start":0.75,"duration":0.25},{"id":32,"day":3,"start":1.25,"duration":0.25},{"id":33,"day":3,"start":2.5,"duration":0.5},{"id":34,"day":3,"start":3.5,"duration":0.75},{"id":35,"day":3,"start":4.0,"duration":0.25},{"id":36,"day":3,"start":4.75,"duration":0.5},{"id":37,"day":3,"start":5.5,"duration":0.5},{"id":38,"day":3,"start":6.0,"duration":0.25},{"id":39,"day":3,"start":6.5,"duration":0.25},{"id":40,"day":3,"start":7.25,"duration":0.25},{"id":41,"day":3,"start":8.0,"duration":0.5},{"id":42,"day":3,"start":8.5,"duration":0.25},{"id":43,"day":3,"start":9.5,"duration":0.75},{"id":44,"day":3,"start":10.75,"duration":0.5},{"id":45,"day":3,"start":11.25,"duration":0.25},{"id":46,"day":3,"start":11.75,"duration":0.25},{"id":47,"day":4,"start":1.5,"duration":1.5},{"id":48,"day":4,"start":2.0,"duration":0.25},{"id":49,"day":4,"start":3.25,"duration":0.5},{"id":50,"day":4,"start":4.0,"duration":0.25},{"id":51,"day":4,"start":4.75,"duration":0.25},{"id":52,"day":4,"start":7.25,"duration":2.0},{"id":53,"day":4,"start":7.75,"duration":0.25},{"id":54,"day":4,"start":8.25,"duration":0.25},{"id":55,"day":4,"start":9.75,"duration":0.75},{"id":56,"day":4,"start":11.0,"duration":0.25}]},"age":-1900,"username":"testUser","id":0};
    getFullUser($http, function(data) {
        $scope.user = data;
    });
    //$scope.slots = $scope.user.slots;

    alert(JSON.stringify($scope.user));

});

And my function:

function getFullUser($http, setUserCallback) {
    $http({method: "GET", url: "api/user", headers: {
        'Content-Type': 'application/json', 'token': localStorage.token}})
          .then(function(result) {
              setUserCallback(result.data);
          });

}

I'm not used to this mind-set of callbacks. Defining what a method should do as an result beforehand is/was a new concept.

1elf
  • 23
  • 4