2015-04-23 4 views
1

У меня есть данные POST для извлечения в проекте Angular.js. Это моя фабрика:AngularJS: Правильный способ возврата объекта на заводе?

angular.module('mtApp').factory('getKey', function($http) { 
    return { 
     getData: function(data) { 
      var key=''; 
      return $http({ 
       url: '../php/key_gen.php', 
       method: "POST", 
       headers: {'Content-Type': 'application/json'} 
       }).success(function (data) { 
        console.log(data); //value is right as expected 
        return data; 
       }) 
       .error(function (data, status, headers, config) { 
        console.log('Erro : ' + status + ' ' + headers); 
       }); 
     } 
    } 
}); 

Путь I'm получения данных является:

$scope.key = 'ok'; 

getKey.getData() 
.success(function($scope,data){ 
    $scope.key = data.GeneratedKey; 
    console.log(data.GeneratedKey); //undefined 
    console.log(data); //200 o.O 
}); 

console.log($scope.key); //still 'ok' O.o 

Как вы можете увидеть в моем коде у меня есть несколько console.log вызовов. При запуске приложения единственное, что я вижу:

mtapp.controller.js:13 ok 
mtapp.app.js:52 Object {GeneratedKey: "d1bc7a5e840a6c24d87b90dde9e075de1f0e3b34978ca9f319…69d839b4e2a004e1f8d728939867afe189cfb8848c6a8ee38"} 
mtapp.controller.js:9 undefined 
mtapp.controller.js:10 200 

Значение в линии mtapp.app.js: 52 должны быть такими же, как mtapp.controller.js: 10. Но объект с завода имеет только значение 200, когда я пытаюсь посмотреть в журнале ...

Моя цель получить значение из JSON на заводе (GeneratedKey) к контроллеру (в $ scope.key).

Что я делаю неправильно? :(

+0

Почему вы принимаете первый аргумент обратного вызова успеха как $ scope? Судя по обратному вызову, который вы использовали на своей фабрике, вы знаете, что вместо этого должны быть данные ... вторым аргументом является код состояния. –

+0

Я должен быть '.success (function (data, $ scope) {'? –

+2

'.success (function (data, statusCode) {' –

ответ

2

Потому что вы имеете дело со вторым параметром, код состояния, вы должны удалить $scope оттуда и использовать data самого

Код

getKey.getData() 
.success(function(data, status, headers, config){ <---here $scope should remove 
    $scope.key = data.GeneratedKey; 
    console.log(data.GeneratedKey); 
    console.log(data); 
}); 
+0

Удивительный! Это проблема. Но я просто не знаю, почему я ( –

+0

@ dipievil Какой пример? Пробовали ли вы читать документацию - https://docs.angularjs.org/api/ng/service/$http –

+0

Да, я читал . Благодаря , –

-1

Попробуйте использовать $ Q в вашей фабрике вместо .

angular.module('mtApp').factory('getKey', function($http, $q) { 
    var getData= function(data) { 
      var key=''; 
      var url = '../php/key_gen.php'; 
      var returned = $http.post(url, data); 
      return $q.all(returned); 

     }; 
    var getKey = { 
    getData: getData 

    }; 


    return getKey; 
}); 


$scope.key = 'ok'; 

getKey.getData(someData).then(function (response, status, headers, config) { 
    console.log(response.data.GeneratedKey); 
}); 
+0

Не знаю, почему someData. Я хочу получить данные с фабрики, а не отправлять ее. Удалив его, я получил ошибку 'TypeError: не могу прочитать свойство« GeneratedKey »неопределенного' –

+0

, ваш getData принимает параметр, следовательно, someData. Вы должны иметь возможность получить ответ от вашего ответа от GEneratedKey. Что возвращает response.data в консоли? – gerl

+0

Это антипатер. Нет никаких оснований, чтобы развернуть обещание, чтобы снова обернуть его. Просто верните обещание, возвращенное '$ http.post (...)' – Martin

0

Как Кевин, основная проблема заключается в асинхронном способе работы angular.js.

Só большая проблема в том, что последняя строка

console.log($scope.key); //still 'ok' O.o 

нужно установить до конца функции, которые требуют завода. И область $ была удалена из функции для правильной работы, поскольку pankajparkar сказал.

$scope.key = 'ok'; 

getKey.getData() 
.success(function(data){ // removed the $scope 
    $scope.key = data.GeneratedKey; 
    console.log($scope.key); //Moved up and it shows correctly in the console 
    ... the rest of my code ... 
}); 

Я не знаю, если это лучшее решение, но работает сейчас! : D

+0

Почему вы не принимаете мой ответ? –

+0

Вы пропустите часть, которую сказал Кевин. –

+0

Вы говорите об асинхронной части? это было очевидно, когда вы делаете ajax? –

Смежные вопросы