2016-02-04 4 views
0

Вот мой метод внутри контроллера, я хочу получить доступ к $ scope.oldcats за пределами данного метода. Использование console.info($scope.oldcats); внутри метода, выводит данные, но используя console.info($scope.oldcats); внешний функция дисплей undefined.

$scope.loadPost = function() { //Issues a GET request to /api/post/:id to get a Post to update 
    $scope.posts = Post.get({ id:$stateParams.id}, function(response){ 
     $scope.posts = response.data; 
     $scope.posts.selcats = response.data.categories; 
     var cats = $scope.posts.categories; 
     $.each(cats, function(arrayID,group) { 
      $scope.allCats.push(group.id); 
     }); 
     $scope.oldcats = $scope.allCats; // <- i want to access it 
     console.info($scope.oldcats); // <- output displays data 
    }); 
    }; 

    $scope.loadPost(); // Load a Post which can be edited on UI 

    console.info($scope.oldcats); // <- output display undefined 
+1

Возможный дубликат [Как я вернуть ответ от асинхронного вызова?] (http://stackoverflow.com/questions/14220321/how-do-return-the-response-from-an-asynchronous-call) – Grundy

ответ

0

Вы сделали несколько ошибок, и вы должны использовать обещания:

$scope.loadPost = function(){ //Issues a GET request to /api/post/:id to get a Post to update   
    $scope.posts = function(){ 
     var deferred = $q.defer(); 
     Post.get({ id:$stateParams.id}, function(response){ 
      $scope.posts = response.data; 
      $scope.posts.selcats = response.data.categories; 
      var cats = $scope.posts.categories; 
      $.each(cats, function(arrayID,group) { 
       $scope.allCats.push(group.id); 
      }); 
      $scope.oldcats = $scope.allCats; // <- i want to access it 
      deferred.resolve($scope.oldcats); 
      console.info($scope.oldcats); // <- output displays data 
    }); 
    return deferred.promise; 
    }; 
    return $scope.posts; 
}; 

$scope.loadPost()().then(function(res){ 
    console.info(res); 
}); 
+0

Я хочу присвоить данные 'res' '$ scope.selectedCategory' вне функции – gudboisgn

+0

Вы можете сделать это '$ scope.selectedCategory = res;' вместо 'console.info (res);', потому что '$ scope' является глобальным объектом внутри контроллера. Это единственный путь. В этом случае вы не можете просто написать что-то вроде '$ scope.selectedCategory = $ scope.loadPost();'. Или я что-то не понимаю, что вы имеете в виду «вне функции», что это за функция (loadPost, сообщения или что-то еще)? –

+0

мой плохой язык извините ... я имею в виду доступ к $ scope.selectedCategory за пределами '$ scope.loadPost()(). Then (function (res) { $ scope.selectedCategory = res; }); он показывает undefined – gudboisgn

0

console.info За пределами функции вызывается до завершения вызова API. Поэтому он регистрирует undefined. Но консоль внутри функции вызывается после завершения вызова API. Это называется асинхронным поведением. Посмотрите Promises

Этот thinkster учебник будет полезно понять асинхронное поведение лучше: Thinkster-understand promises

+0

с помощью console.log также показывает неопределенные .. и переменная $ scope не имеют данных – gudboisgn

+0

Все, что вы используете, покажет вам undefined, потому что вызов API еще не завершен. –

+0

Как мы можем получить доступ к переменной $ scope.oldcats вне метода? – gudboisgn

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