Функция обратного вызова AngularJS не работает

Я использую WebAPI на стороне сервера:

    public int Get(int productId)
    {
        //removed the actual logic to simplify the example
        return 101;
    }

Угловой:

$scope.showDetails = function (product) {
    $scope.selectedProduct = product;
    var queryArgs = { productId: product.id };
    $scope.averageQuantity = Quantity.query(queryArgs, function() {
        //callback function
        console.log($scope.averageQuantity); // this shows a promise instead of an actual object
        //and then open modal and pass the $scope as a parameter
    });
};

//the resource:
.factory('Quantity', ['$resource', function ($resource) {
return $resource('/api/quantity', {}, { 'query': { method: 'GET', isArray: false } });
}])

Вместо числа 101 я вижу обещание: {"0":"1","1":"0","2":"1"}

Как я могу реализовать обратный вызов, чтобы увидеть объект, а не обещание?


person Toonsylvania    schedule 20.05.2014    source источник
comment
Похоже, вы совершили ошибку, аналогичную OP в этом вопросе: stackoverflow.com/questions/23749148/ (см. ответ RobM). Вместо того, чтобы пытаться передать обратный вызов в качестве параметра, вам нужно использовать then, например $scope.averageQuantity = Quantity.query(queryArgs).then(function(results){ /* console.log(results.data */ })   -  person Marc Kline    schedule 20.05.2014
comment
Спасибо за ответ, Марк. Я думаю, что метод then() является специфичным для jQuery методом, и я не использую jQuery в этом проекте (меня просили этого не делать). Я посмотрел на эту ссылку, и мне действительно не хватало параметра (для данных поста), который был прямо перед функцией успеха. К сожалению, это все еще не работает. Это заставляет меня думать, что это может быть неправильная конфигурация $resource, а не проблема с обратным вызовом? Вот что я пробовал: $scope.averageQuantity = Quantity.query(queryArgs, {}, function(returnValue, responseHeaders) { console.log(returnValue); });   -  person Toonsylvania    schedule 20.05.2014
comment
then не зависит от jQuery. Angular включает в себя $q, созданный по образцу Q для промисов, который включает метод then. Тем не менее, я должен признать, что я был неправ в своем первоначальном суждении. Проблема не имеет ничего общего с обратными вызовами или обещаниями. Мой предстоящий ответ покажет, в чем проблема.   -  person Marc Kline    schedule 20.05.2014


Ответы (2)


Проблема не в вашей реализации обратного вызова. Проблема в том, что вы используете $resource, предназначенный для использования с ресурсами RESTful API, которые возвращают строки в формате JSON, со службой, которая возвращает обычный текст без структурированного форматирования.

Решение 1.

Если вы можете изменить формат данных, возвращаемых вашим сервером WebAPI, вы можете заставить его возвращать простой объект JSON. Это может быть что-то вроде:

{"value": "101"}

Тогда ваш $resource будет работать более или менее как есть.

Решение 2.

Если вы не можете или не хотите изменять свой ответ WebAPI, вы можете использовать $http вместо $resource в Angular:

$http.get('example', {params: params});

Это будет работать для получения ответа в виде простого текста без искажения данных ответа, как это делает $resource.

Рабочий планкер, демонстрирующий оба метода

person Marc Kline    schedule 20.05.2014
comment
Спасибо, Марк! Я использовал что-то очень похожее, используя $http, вот код: $scope.showDetails = function(product) { $scope.selectedProduct = product; $http.get('/api/quantity?productId=' + product.id).then(function (results) { $scope.averageQuantity = results.data; }); }; - person Toonsylvania; 20.05.2014

Убедитесь, что вы включаете заголовки application/json и данные json из webapi, похоже, это не так.

person Cranespud    schedule 20.05.2014