我带了一个带指令的小角度应用程序。 要从服务器端重新获取数据,我使用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);
我根本没有数据。请帮助我理解这种行为。
答案 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
})