0

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

4

1 回答 1

1

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

尝试alert($scope.searchIndexes);在 AJAX 调用的末尾添加一个。您会注意到,此警报的输出实际上会出现在您的 AJAX 调用外部的输出下方。alert()

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

于 2014-07-23T20:45:49.127 回答