Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度工厂不传回数据_Javascript_Angularjs_Angularjs Factory - Fatal编程技术网

Javascript 角度工厂不传回数据

Javascript 角度工厂不传回数据,javascript,angularjs,angularjs-factory,Javascript,Angularjs,Angularjs Factory,我试图创建一个角度工厂,这是基于一个多站点课程的示例 通过在Chrome中调试代码,它似乎运行良好。当我调试它时,我可以看到服务获取我的数据并将其放入数组中,但当我查看$scope.data或dataService.data中的控制器时,数组是空的。我没有看到任何javascript错误。我不确定我做错了什么,还有什么建议。我使用的是AngularJSV1.3.15 module.factory("dataService", function($http,$routeParams,$q) { v

我试图创建一个角度工厂,这是基于一个多站点课程的示例

通过在Chrome中调试代码,它似乎运行良好。当我调试它时,我可以看到服务获取我的数据并将其放入数组中,但当我查看$scope.data或dataService.data中的控制器时,数组是空的。我没有看到任何javascript错误。我不确定我做错了什么,还有什么建议。我使用的是AngularJSV1.3.15

module.factory("dataService", function($http,$routeParams,$q) {
var _data = [];

var _getData = function () {
    var deferred = $q.defer();

    $http.get("/api/v1/myAPI?mainType=" + $routeParams.mainType + "&subType=" + $routeParams.subType)
        .then(function (result) {
            angular.copy(result.data,_data);
            deferred.resolve();
        },
        function () {
            //Error
            deferred.reject();
        });
    return deferred.promise;
};

return {
    data: _data,
    getData: _getData
};});

module.controller('dataController', ['$scope', '$http', '$routeParams', 'dataService',function ($scope, $http, $routeParams, dataService) {
$scope.data = dataService;
$scope.dataReturned = true;
$scope.isBusy = true;

dataService.getData().then(function () {
    if (dataService.data == 0)
        $scope.dataReturned = false;
},
function () {
    //Error
    alert("could not load data");
})
.then(function () {
    $scope.isBusy = false;
})}]);

您有“data:_data”,而数组的名称仅为“data”。将变量的名称更改为匹配,它将工作:

var _data = [];

事实上,您的代码中有一些错误:

  • 在您的服务中,您定义
    var data=[]
    ,但返回
    数据:\u data,
    。因此,您应该将定义更正为
    var\u data=[]
  • 您不定义
    \u bling
    ,但使用
    angular.copy(result.data,\u bling)
还有一个问题,为什么要将服务分配给
$scope.data
$scope.data=dataService

编辑: 请注意,以下代码中有3处更改:

  • 注释
    $scope.data=dataService,因为它没有意义,我认为
    $scope.data
    应该是服务返回的数据
  • $scope.data=dataService.data,如我在第1点中所述。您可以从控制台看到结果
  • 在if条件下,我认为您需要比较返回的数据数组的长度,而不是数据

    module.controller('dataController', ['$scope', '$http', '$routeParams', 'dataService',function ($scope, $http, $routeParams, dataService) {
    // $scope.data = dataService;
    $scope.dataReturned = true;
    $scope.isBusy = true;
    
    dataService.getData().then(function () {
        if (dataService.data.length === 0){
            $scope.dataReturned = false;
        }else{
            $scope.data = dataService.data;
            console.log($scope.data);
        }
    },
    // other codes...
    })}]);
    

  • 为什么要这样使用$q的延迟

    正确使用$q的方法:

    $http.get("/api/v1/myAPI?mainType=" + $routeParams.mainType + "&subType=" + $routeParams.subType)
        .success(function (result) {
            deferred.resolve(result);
        }).error(
        function () {
            //Error
            deferred.reject();
        });
    
    然后在控制器中

    dataService
        .getData()
        .then(function success(result) {
            $scope.data = result; //assing retrived data to scope variable
        },
        function error() {
            //Error
            alert("could not load data");
        });
    

    因此,当我以这种方式尝试时,在.then语句TypeError:Cannot read property'then'of undefined at new@AndrewCrowder在_getData函数中还有“return deferred.promise;”行吗?从那以后,我仍然有义务回报你的承诺。谢谢,我想我把它拿出来了,不再认为它是必要的了。然而,我想我会放弃整个方法,因为我显然不明白其中的一些东西。我让它工作了,但是我对不相关的JavaScript进行了一点调整,它停止了工作。因为我之前有一个非工厂版本在工作,所以我要回到那个版本。我知道答案的功劳在这里是一件大事,我不知道该怎么办,因为我是放弃解决方案的人,而不是你。我真的很感谢你的时间和你提供的帮助。很抱歉,这些错误是在我把代码放在这里时产生的。不确定这是怎么发生的这是我第一次询问堆栈溢出问题。我已经修复了上面的帖子,但仍然有相同的问题。至于我为什么要这样做。这就是我所遵循的例子。对我来说似乎很奇怪。他说it能够检测数据服务的变化。整个想法是,我可以在这里存储数据的共享副本,并减少到服务器的往返。老实说,我不确定我是否真的喜欢它,我在没有服务的情况下找到了所有这些工作。@AndrewCrowder我已经修改了我的答案,给你一些代码。它应该会起作用。你能试试吗?谢谢,我确实使用了与你类似的代码,但它似乎是间歇性的,它可以工作一段时间,然后在我对java脚本做了一些非常小的调整后就停止了。因为我之前有一个非工厂版本在工作,所以我要回到那个版本。我知道答案的功劳在这里是一件大事,我不知道该怎么办,因为我是放弃解决方案的人,而不是你。“我真的很感谢你的时间和你提供的帮助。”安德鲁克罗德说,为了选票,请放心。如果我能帮助你,我会很高兴的。
    dataService
        .getData()
        .then(function success(result) {
            $scope.data = result; //assing retrived data to scope variable
        },
        function error() {
            //Error
            alert("could not load data");
        });