我在AngularJS中有一个名为WebService的工厂,它返回一个$ resource对象。
angular.module('cstarsServices')
.factory('WebService', function ($resource)
{
return $resource("some_url_here/:op1/:op2/:op3/:op4",
{op1: 'indexes'},
{
getIndexes: {
isArray: true,
method: 'GET'
}
}
);
});
在我的一个控制器中,我调用了getIndexes:
WebService.getIndexes(function(data){
// SearchIndex Table
$scope.languages = [];
var languages = [];
var ajaxResponse = [];
angular.forEach(data, function (item, i)
{
if (item.sourceTypes != null)
{
ajaxResponse.push({ selected: false, name: item.name, languages: item.sourceTypes[0] });
languages[item.sourceTypes[0]] = item.sourceTypes[0];
}
});
$scope.searchIndexes = ajaxResponse;
for (var key in languages)
{
$scope.languages.push(languages[key]);
}
$scope.language = languages[0];
});
//This is undefined
alert($scope.searchIndexes);
然而,这似乎无法正确更新$ scope:例如$ scope.searchIndexes的值已定义并且在函数内部具有正确的数据 但未定义外。发生了什么,以及如何让$ scope更新整个控制器而不仅仅是回调函数内部?提前感谢您的帮助。
答案 0 :(得分:1)
您的WebService.getIndexes
函数正在进行异步AJAX调用。它之下的alert()
命令在WebService.getIndexes
调用之后立即执行,但在从后端服务实际返回任何数据之前执行。因此,您在AJAX调用中执行的$scope
赋值实际上发生在alert()
命令(或控制器中不在函数中的任何其他代码)之后。
尝试在AJAX调用结束时放置alert($scope.searchIndexes);
。您会注意到此警报的输出实际上会在您的AJAX调用之外的alert()
输出
如果没有看到控制器的其余部分,很难推荐解决方法。但这里的一般经验法则是仅在函数中引用$scope.searchIndexes
。只要在控制器完全加载后调用这些函数,您就可以毫无问题地引用$scope.searchIndexes
。