如何在AngularJS

时间:2015-07-16 13:22:54

标签: javascript angularjs angular-promise

我带了一个带指令的小角度应用程序。 要从服务器端重新获取数据,我使用ngRoute。在检索数据之后,我将结果绑定到范围属性,并使用ng-repeat解析结果,如下所示:

 <div class="col-xs-12" ng-repeat="clsRow in classificatorData">
   <span>{{clsRow.code}}</span>
 </div>

此功能从资源

检索数据
var getClassificatorDataScope = function (criteria, predicate) {
                references.initialize('classificators');
                references
                    .getRefereces(null, $scope.classificatorType, criteria, predicate == null ? "NONE" : predicate, $scope.limitLevel, null)
                    .$promise.then(function (result) {
                        $scope.classificatorData = result.Data;
                    });


            };

一切正常。但是如果我尝试像这样实现传递结果数据容器(dataScope)

var getClassificatorDataScope = function (criteria, predicate, dataScope) {
                references.initialize('classificators');
                references
                    .getRefereces(null, $scope.classificatorType, criteria, predicate == null ? "NONE" : predicate, $scope.limitLevel, null)
                    .$promise.then(function (result) {
                        dataScope = result.Data;
                    });


            };

并在控制器中使用它

getClassificatorDataScope("CODE", null, $scope.classificatorData);

我根本没有数据。请帮助我理解这种行为。

3 个答案:

答案 0 :(得分:2)

这里有2个问题。

dataScope = result.Data;

第一个就是这个。这并不像你期望的那样。 它不会替换$scope.classificatorData 。它所做的只是将dataScope中的本地getClassificatorDataScope变量替换为result.Data(是的,它不是&#34;通过引用&#34传递)。

其次,您未正确使用承诺。您返回承诺进行收听,而不是将范围传递给who-know-where。您的数据层通常不应该知道$scope或UI。将promise返回给控制器,让它监听来自它的数据。

// In your function
var getClassificatorDataScope = function(criteria, predicate) {
  references.initialize('classificators');
  return references
    .getRefereces(null, $scope.classificatorType, criteria, predicate == null ? "NONE" : predicate, $scope.limitLevel, null)
    .$promise
};

// In your controller
getClassificatorDataScope("CODE", null).then(function(result){
  $scope.classificatorData = result.Data;
});

答案 1 :(得分:0)

问题可能出在references.getRefereces方法中。它应该返回一个承诺,然后用适当的结果解决它(我看到你试图从结果中访问&#34;数据&#34;属性。)。像这样的东西:

reference.getReferences = function() {
       var deferred = $q.defer();  
       someAsyncOperations(function callback(){
          deferred.resolve({Data: result})  // make sure you have the "Data" attr
       })
       return deferred.promise;

// or if someAyncOperations already return a promise
// return someAsyncOperations.then(function(result) {
//    return {Data: result};
// });
    }

答案 2 :(得分:0)

似乎在第二个示例中,您尝试将从服务器检索到的数据分配给dataScope,但由于AJAX数据加载是异步的,因此$promise的解析晚于ng-repeat的模板绘制。

没有足够的代码来编写整个示例 - 如何实现它。但基本上你应该从服务中返回$promise并在控制器中更改$ scope变量

promise.then(function() {
//do stuff with $scope variables
})