Michael
Michael

Reputation: 16142

Return from the function wasn't assigned to the $scope?

Here is my controller:

$scope.mainModel = getReviews({model:mainModelArr[1]});
$scope.compareModel = getReviews({model:compareModelArr[1]});

function getReviews(data) {
    $http.post(url, data)
    .success(function(res) {
        formatReviews(res)
    })
    .error(function(err) {
        console.log("Something went wrong: "+err);
    });
}

function formatReviews(data) {
    var review = data[0];
    review.sumReviews = (review.sumReviews/review.ratingAvg).toFixed(0);
    review.sumRecommend = (review.sumRecommend/review.sumReviews*100).toFixed(1);
    review.ratingAvg = (review.ratingAvg).toFixed(1);
    console.log(review); // logs message fine 
    return review;
}

These functions work fine, logs review var., but somehow it didn't assign review variable neither to $scope.mainModel nor to $scope.compareModel.

NOTE: I know that it wasn't assigned, because it's never showed up in HTML:

<p>{{mainModel}}</p> 

What did I do wrong and how can I fix that?

Upvotes: 1

Views: 36

Answers (2)

dfsq
dfsq

Reputation: 193311

Since asynchronous code won't allow you simply return the value, you should work with promises using their then methods:

getReviews({model: mainModelArr[1]}).then(function(data) {
    $scope.mainModel = data;
});

getReviews({model: compareModelArr[1]}).then(function(data) {
    $scope.compareModel = data;
});

function getReviews(data) {
    return $http.post(url, data)
    .success(formatReviews)
    .error(function(err) {
        console.log("Something went wrong: "+err);
    });
}

Upvotes: 1

Umidbek
Umidbek

Reputation: 1504

Ajax requests works Async, angularjs use promises to handle this requests

$scope.mainModel = undefined;
$scope.compareModel = undefined;

getReviews({model:mainModelArr[1]}).success(function(res){
    $scope.mainModel = formatReviews(res);
});

getReviews({model:compareModelArr[1]}).success(function(res){
    $scope.compareModel = formatReviews(res);
});

If you return post request, you can handle it anywhere, where you call getReviews method

function getReviews(data) {
    return $http.post(url, data)
    .error(function(err) {
        console.log("Something went wrong:", err);
    });
}

function formatReviews(data) {
    var review = data[0];
    review.sumReviews = (review.sumReviews / review.ratingAvg).toFixed(0);
    review.sumRecommend = (review.sumRecommend / review.sumReviews * 100).toFixed(1);
    review.ratingAvg = (review.ratingAvg).toFixed(1);   
    console.log(review); // logs message fine 
    return review;
}

Upvotes: 1

Related Questions