Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.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 解析工厂构造函数中的Restangular.get_Javascript_Angularjs_Restangular - Fatal编程技术网

Javascript 解析工厂构造函数中的Restangular.get

Javascript 解析工厂构造函数中的Restangular.get,javascript,angularjs,restangular,Javascript,Angularjs,Restangular,我正在使用Restanglar管理对Angular应用程序中RESTful后端的访问。下面的调用将获取后端中的所有结果 Restangular.all('results').getList().then(function(results) { $scope.results = results; }); 我已经使用extendModel函数将原型函数添加到一些后端模型中,因此在将结果返回给我之前,它们会运行此函数 Restangular.extendModel('results', fun

我正在使用Restanglar管理对Angular应用程序中RESTful后端的访问。下面的调用将获取后端中的所有结果

Restangular.all('results').getList().then(function(results) {
   $scope.results = results;
});
我已经使用extendModel函数将原型函数添加到一些后端模型中,因此在将结果返回给我之前,它们会运行此函数

Restangular.extendModel('results', function(model) {
                var result = new Result(model);               
                return result;
            });
我的工厂是这样的

angular.module('RankingsApp')
    .factory('Result', function(Extender, Restangular, $rootScope) {

        function Result(model) {                
            angular.extend(this, model);
             Restangular.one('fencers', this.links.fencer).get().then(function(response) {
                this.fencer = response;
            });
        };

        Result.prototype.Fencer = function() {
            return this.fencer;
        };       

        return Result;
    });
我添加到结果中的一个函数是返回与结果关联的Fencer。然而,当我从结果构造函数内部进行异步调用时,值似乎被设置了。我的假设是,这是因为调用的异步性质,但我目前不知道如何实际修复它

Fencer函数在我的UI中用于显示一些附加信息

<tr ng-repeat='result in results'>                    
    <td>{{result.Fencer().name}}</td>                   
</tr>

如果您的UI依赖于数据,我会在模块的解析配置中使用一个函数来获取数据,然后有条件地处理用户,即成功或失败

延期承诺的简单示例:

function config($stateProvider) {
    $stateProvider

    .state('fencer', {
        url: '/fencer/result',
        controller: 'FencerCtrl',
        resolve: {
            resultService: function getFencerResult($q, dataservice, sessionService) {
                var deferred = $q.defer();
                var myData = {};
                myData = dataservice.getFormDefaults();
                deferred.resolve(myData);
                return deferred.promise;
            }
        }
    });
}
更新的控制器代码:

等待控制器从资源更新

用于旋转图标

<tr ng-repeat='result in results'>                    
    <td ng-show="results.length < 1"> <i class="fa fa-spinner fa-pulse"></i> Loading</td>
    <td ng-show="results.length>0">{{result.Fencer().name}}</td>                   
</tr>

所以我终于想出了一个办法让它发挥作用。在我最初的构造器中,我设置了击剑者

function Result(model) {                
            angular.extend(this, model);
             Restangular.one('fencers', this.links.fencer).get().then(function(response) {
                this.fencer = response;
            });
        }; 
为了解决这个问题,我需要创建一个setter函数,并将其附加到我已经存在的Fencer上

Result.prototype.Fencer = function(fencer) {
    if(fencer)
    {
        this.fencer = fencer;
    }
    return this.fencer;
};   

我已经更新了我的问题,包括如何从后端获取初始结果列表,并添加了更多关于我的应用程序流程如何工作的描述。当然。我用你的控制器代码更新了我的答案。试试看。在另一个事件发生之前,您的摘要周期似乎不会被触发,从而延迟对视图的更新。将调用包装在$scope中。$apply会触发已在进行的操作。。另一种方法是让你的用户界面处理等待资源的问题啊,我认为我们在不同的路径上,我能够毫无问题地返回结果。我的问题是,在我得到结果后,我将其传递到一个工厂,在工厂内,我正在对后端进行另一个调用,并尝试将其附加到原始结果。我本可以用更好的措辞。我会看看是否可以重构我原来的问题
Result.prototype.Fencer = function(fencer) {
    if(fencer)
    {
        this.fencer = fencer;
    }
    return this.fencer;
};