AngularJS范围问题与$ http

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AngularJS范围问题与$ http相关的知识,希望对你有一定的参考价值。

继续我与AngularJS的冒险,我有我认为是范围问题,但不完全确定。

在我的控制器中,我正在为演示目的构建两个测试阵列,search.filterDemo和search.filter(真实数据)。

调节器

 app.controller('searchBtnCtrl', ['$scope', '$http', function ($scope, $http) {
var search = this;

            search.filter = {};
            search.results = [];
            search.resultsDemo = [];
            search.keywordsToFilter = [
                { name: 'itemA' },
                { name: 'itemB' },
                { name: 'itemC' },
                { name: 'itemD' }
            ];

$scope.performSearch = function () {
                search.resultsDemo = [
                    { name: 'itemA', content: 'This is demo content' },
                    { name: 'itemB', content: 'This is demo content' },
                    { name: 'itemC', content: 'This is demo content' },
                    { name: 'itemD', content: 'This is demo content' }
                ];

$http.get('http://localhost/content').then(function (response) {
     search.resultCount = response.data.response.docs.length;

     for (var i = 0; i < search.resultCount; i++) {
         search.results.push({ name: search.results[i]._name[0], content: search.resultsTemp[i]._content[0]});
     }

     console.log(search.results);
  });

  console.log(search.resultsDemo);
  console.log(search.results);
}
}]);

search.resultsDemo的控制台日志输出正如我所期望的那样:

Array [ Object, Object, Object, Object, Object, Object, Object, Object ]

然后,如果我点击Array链接,我会看到该数组有8个项目

Array[8]

这对我来说都是正确的,我的第一个阵列是保持它的范围。

但是我的第二个阵列并不完全。

第二个数组的输出如下:在$ http调用内部显示正确 -

Array [ Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, 3 more… ]

然而,数组的第二个console.log只有3行后显示为:

Array[ ] 

如果我点击它显示的数组链接:

阵列[0]

有趣的是数据在那里,它只是没有显示为像第一个数组的对象(我可以点击数组链接,我确实看到控制台中的数组[0]下列出的对象,我可以旋转他们打开看数据。

那么这是一个范围问题,还是与Angular的异步性质相关的其他东西没有正确格式化我的第二个(真实)数组?

它让我变得笨拙,因为我需要让我的第二个数组格式化,就像第一个数组一样,以便稍后在函数中进行处理。

谢谢!

答案

那是因为你的第二个console.log超出了你的then声明的范围。当您的第二个console.log运行时,数据可能尚未返回。

事实上,我敢说你的第二个console.log(search.results)可能会在你的第一个console.log(search.results)之前在你的控制台中结束。

以上是关于AngularJS范围问题与$ http的主要内容,如果未能解决你的问题,请参考以下文章

angularJS使用ocLazyLoad实现js延迟加载

TypeScript/angularJS HTTP GET 请求中的范围

使用引导验证插件时,AngularJS 范围不可用

绑定文本框时,AngularJs范围未定义

在 AngularJS 中设置应用程序范围的 HTTP 标头

AngularJS在范围之间过滤