Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.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
Angularjs在作用域的另一个数组中推送从资源服务检索的数据数组_Angularjs - Fatal编程技术网

Angularjs在作用域的另一个数组中推送从资源服务检索的数据数组

Angularjs在作用域的另一个数组中推送从资源服务检索的数据数组,angularjs,Angularjs,我正在尝试实现分页服务。因此,在控制器中,我有两种方法从数据库中获取船只列表(使用Rails API)。要获取数据,控制器正在使用带有资源的服务(简单查询方法): 在我的控制器中,我有两种方法(也许我可以只使用一种,但我认为这一点并不重要): 和选项1: $scope.moreResultsBoats = function() { $scope.pagIndex = $scope.pagIndex + 1;

我正在尝试实现分页服务。因此,在控制器中,我有两种方法从数据库中获取船只列表(使用Rails API)。要获取数据,控制器正在使用带有资源的服务(简单查询方法):

在我的控制器中,我有两种方法(也许我可以只使用一种,但我认为这一点并不重要):

选项1:

   $scope.moreResultsBoats = function() {  
        $scope.pagIndex = $scope.pagIndex + 1;                                 
        $scope.moreBoats = Boat.query({pagIndex: $scope.pagIndex});

        console.log("moreBoats:" + $scope.moreBoats);
        angular.forEach($scope.moreBoats, function(boat, key) {             
            $scope.boats.push(boat);
        });
  }
选项2

$scope.moreResultsBoats = function() {  
            $scope.pagIndex = $scope.pagIndex + 1;                                 
            $scope.moreBoats = Boat.query({pagIndex: $scope.pagIndex});

            console.log("moreBoats:" + $scope.moreBoats);
            $scope.boats.push.apply($scope.boats, $scope.moreBoats);
}
这两个选项都没有将$scope.moreboots中的新船数组添加到$scope.boots中(或者至少视图没有刷新)。 我想我不了解AngularJS是如何工作的,因为console.log只显示以下内容:
moreboots:

但是,如果我将{{moreboots | json}}添加到我的视图中,出于跟踪目的,我可以在船只到达时看到json格式的船只

我错过了什么

谢谢,
Roberto.

您的工厂
是异步的,并返回
承诺

这就是为什么稍后在
{{moreboots | json}
中获取数据的原因

要使其生效,您可以使用
包装承诺。然后

比如:

Boat.query({pagIndex: $scope.pagIndex})
                    .then(function (result) {
                       $scope.moreBoats = result;                           
                    }, function (result) {
                        alert("Error: No data returned");
                    });  
工厂:

.factory('Boat',   function($resource){          
        var boats =
         $resource('http://127.0.0.1\\:3000/:action', {}, {     
            query: {method:'GET', params:{action:'boats'}, isArray:true},
            getBoatsByBusinessId: {method:'GET', params:{action:'boatsByBusinessId'}, isArray:true}
         });


         var factory = {
            query: function (selectedSubject) {
                var deferred = $q.defer();
                 deferred.resolve(boats);
                return deferred.promise;
            }
        }
        return factory;         
      }
  )
关于承诺的参考资料

$scope.moreResultsBoats = function() {  
            $scope.pagIndex = $scope.pagIndex + 1;                                 
            $scope.moreBoats = Boat.query({pagIndex: $scope.pagIndex});

            console.log("moreBoats:" + $scope.moreBoats);
            $scope.boats.push.apply($scope.boats, $scope.moreBoats);
}
承诺表示未来的值,通常是异步操作的未来结果,并允许我们定义一旦该值可用或发生错误时将发生什么


您的工厂
Boat
是异步的,并返回
承诺

这就是为什么稍后在
{{moreboots | json}
中获取数据的原因

要使其生效,您可以使用
包装承诺。然后

比如:

Boat.query({pagIndex: $scope.pagIndex})
                    .then(function (result) {
                       $scope.moreBoats = result;                           
                    }, function (result) {
                        alert("Error: No data returned");
                    });  
工厂:

.factory('Boat',   function($resource){          
        var boats =
         $resource('http://127.0.0.1\\:3000/:action', {}, {     
            query: {method:'GET', params:{action:'boats'}, isArray:true},
            getBoatsByBusinessId: {method:'GET', params:{action:'boatsByBusinessId'}, isArray:true}
         });


         var factory = {
            query: function (selectedSubject) {
                var deferred = $q.defer();
                 deferred.resolve(boats);
                return deferred.promise;
            }
        }
        return factory;         
      }
  )
关于承诺的参考资料

$scope.moreResultsBoats = function() {  
            $scope.pagIndex = $scope.pagIndex + 1;                                 
            $scope.moreBoats = Boat.query({pagIndex: $scope.pagIndex});

            console.log("moreBoats:" + $scope.moreBoats);
            $scope.boats.push.apply($scope.boats, $scope.moreBoats);
}
承诺表示未来的值,通常是异步操作的未来结果,并允许我们定义一旦该值可用或发生错误时将发生什么


感谢您的回复@Maxim。我会试试你最后的解决办法。无论如何,我现在已将控制器更新为:

$scope.moreResultsBoats = function() {  
            $scope.pagIndex = $scope.pagIndex + 1;                                 
            Boat.query({pagIndex: $scope.pagIndex}, 
                function success(result) {
                    console.log('Ejecuting callback. Result:' + result);
                    $scope.boats.push.apply($scope.boats, result);      
                }
            );                              
        };

再次感谢

感谢您的回复@Maxim。我会试试你最后的解决办法。无论如何,我现在已将控制器更新为:

$scope.moreResultsBoats = function() {  
            $scope.pagIndex = $scope.pagIndex + 1;                                 
            Boat.query({pagIndex: $scope.pagIndex}, 
                function success(result) {
                    console.log('Ejecuting callback. Result:' + result);
                    $scope.boats.push.apply($scope.boats, result);      
                }
            );                              
        };

再次感谢

我得到了这个错误:TypeError:Object[Object Array]在Object.BoatListCtrl.$scope.moreResultsBoats上没有“then”方法。我认为这与AngularJS版本有关。我正在研究AngularJS 1.0.7。我的版本有任何变通方法或其他解决方案吗?我得到以下错误:TypeError:Object[Object Array]在Object.BoatListCtrl.$scope.moreResultsBoats中没有“then”方法。我认为这与AngularJS版本有关。我正在研究AngularJS 1.0.7。我的版本有什么变通方法或其他解决方案吗?