Javascript AngularJS在方法之外访问$scope

Javascript AngularJS在方法之外访问$scope,javascript,angularjs,Javascript,Angularjs,这是我在控制器中的方法,我想在下面给定的方法之外访问$scope.oldcats。 使用console.info($scope.oldcats)方法内部,输出数据, 但是使用console.info($scope.oldcats)外部功能显示未定义 $scope.loadPost = function() { //Issues a GET request to /api/post/:id to get a Post to update $scope.posts = Post.get({

这是我在控制器中的方法,我想在下面给定的方法之外访问$scope.oldcats。 使用
console.info($scope.oldcats)方法内部,输出数据,
但是使用
console.info($scope.oldcats)外部功能显示
未定义

$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
$scope.loadPost=function(){//向/api/post/:id发出GET请求以获取要更新的帖子
$scope.posts=Post.get({id:$stateParams.id},函数(响应){
$scope.posts=response.data;
$scope.posts.selcats=response.data.categories;
var cats=$scope.posts.categories;
$。每个(猫,功能(阵列ID,组){
$scope.allCats.push(group.id);
});

$scope.oldcats=$scope.allCats;//函数外部的
console.info
在API调用完成之前被调用。因此它记录
未定义的
。但函数内部的控制台在API调用完成之后被调用。
这称为异步行为。
看看


thinkster
教程将有助于更好地理解异步行为:

您犯了几个错误,应该使用承诺:

$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);
});
$scope.loadPost=function(){//向/api/post/:id发出GET请求以获取要更新的帖子
$scope.posts=函数(){
var deferred=$q.deferred();
get({id:$stateParams.id},函数(响应){
$scope.posts=response.data;
$scope.posts.selcats=response.data.categories;
var cats=$scope.posts.categories;
$。每个(猫,功能(阵列ID,组){
$scope.allCats.push(group.id);
});

$scope.oldcats=$scope.allCats;//using console.log的可能副本也显示undefined..和$scope变量没有数据您使用的任何东西都将显示未定义,因为API调用尚未完成。我们如何在方法之外访问$scope.oldcats变量?您可以用与现在相同的方式访问它,但您将使用它我们必须等待api调用完成。为此,您需要承诺,在调用完成后将通知您。我想在函数外部将'res'数据分配给'$scope.selectedCategory'。您可以这样做
$scope.selectedCategory=res;
而不是
console.info(res);
,因为
$scope
是控制器内部的全局对象。这是唯一的方法。在这种情况下,你不能只写
$scope.selectedCategory=$scope.loadPost();
。或者我不明白,你说的“函数外部”是什么意思,这个函数是什么(loadPost,posts或其他)?我的语言不好,对不起…我是说在“$scope.loadPost()()”之外访问$scope.selectedCategory。然后(函数(res){$scope.selectedCategory=res;}”);“它显示未定义。在上次构造中检查它是否未定义?我创建了simple(Post.get我在$interval服务上通过means模拟),我想它会对您有所帮助。”。