范围未更新外部资源回调函数

时间:2014-07-23 19:22:38

标签: javascript angularjs scope ngresource

我在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更新整个控制器而不仅仅是回调函数内部?提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您的WebService.getIndexes函数正在进行异步AJAX调用。它之下的alert()命令在WebService.getIndexes调用之后立即执行,但在从后端服务实际返回任何数据之前执行。因此,您在AJAX调用中执行的$scope赋值实际上发生在alert()命令(或控制器中不在函数中的任何其他代码)之后。

尝试在AJAX调用结束时放置alert($scope.searchIndexes);。您会注意到此警报的输出实际上会在您的AJAX调用之外的alert()输出

如果没有看到控制器的其余部分,很难推荐解决方法。但这里的一般经验法则是仅在函数中引用$scope.searchIndexes。只要在控制器完全加载后调用这些函数,您就可以毫无问题地引用$scope.searchIndexes