如何使 ng-init "wait" 直到所有库都完全加载?

How to make ng-init "wait" until all libraries are fully loaded?

我正在使用 angularjs 并且在我的部分中进行了这些 ng-init 调用:

<div ng-init="invited()">

在我的控制器中,邀请电话的结构如下。它有一个 gapi 异步调用:

    $scope.invited = function () {

    gapi.client.conference.invited().
        execute(function(resp){
            $scope.$apply(function() {
                if (resp.error){
                    $log.error('There was an Error');
                }
                else {
                    $log.info("Success");
                    $scope.invitedHangouts = []
                    $scope.invitedHangout=[]
                    angular.forEach(resp.items, function(invitedHangout){
                        $scope.invitedHangouts.push(invitedHangout);
                    });
                }
            });
        });

};

问题是每当我用上面的部分刷新页面时,我都会得到一个 TypeError: Cannot read 属性 'invited' of undefined.

此时页面已加载。但是,我注意到奇怪的行为,一旦我刷新页面,然后我得到那个 TypeError,当我导航到另一个页面然后返回到上面的 ng-init 部分时,它加载正常。然后它输出 "Success" 以及其余的正确信息。

为什么当我刷新页面时,我得到 TypeError,然后在我刷新页面后,得到 TypeError,离开页面然后 return 到那个页面,它执行得好吗?

我怀疑是因为它还没有加载完我的后端服务器代码——gapi。 gapi.client.conference.invited() 中的 invited() 是我用 python 代码为我的服务器编写的函数。

到目前为止,从解决这个问题开始,因为它最终在我离开然后 return 到该页面后成功执行了 invited() 函数,我假设它与以下事实有关我的前端正在调用尚未初始化的后端。

奇怪的是,如果我的假设是正确的,那么为什么会这样,当我将前端调用拼错为后端不存在的东西时(实际上是在模仿前端正在调用未完成加载时的后端)我得到一个完全不同的错误?我不应该得到相同的 TypeError 吗?

我把 gapi 调用拼错了: gapi.client.conference.boomshakalaka()。 boomshakalaka() 不在我的后端 python 代码中。

一开始,当我在后台用这个不存在的函数刷新页面时,我得到了和上面一样的错误。然后,当我离开并返回同一页面时,我得到了不同类型的错误: 类型错误:gapi.client.conference.boomshakalaka 不是函数

之前只是undefined的TypeError,现在是不是函数的TypeError

它现在怎么知道它不是一个函数?它只能知道,如果它加载了后端并意识到在尝试进行调用时没有这样的功能。鉴于不存在的功能,它不应该从初始页面刷新开始就这样做吗?

我认为它可能在加载后端的 gapi.client.conference 部分和尚未将所有内容完全加载到 "know" 之间陷入困境,boomshakalaka 确实不存在。

我怎样才能用这个 gapi 调用初始化这个页面,但让它等到后端完全加载?同样,我怀疑是我的后端代码没有完全加载,因为当我在刷新后离开页面并返回时,我没有收到这样的错误。然后一切都成功地打印到控制台。只有当我刷新时,我才得到 TypeError。

想法?

问题区域是 gapi.client.conference 而您可能会尝试将 $timeout 包裹在现有代码中以提供你的脚本需要一些时间来初始化它。

肮脏的修复可能会起作用,但您应该首先尝试找出 gapi 服务失败的原因。也许在它准备好时做一个回调而不是做 angular init.

$scope.invited = function () {
$timeout(function(){
  gapi.client.conference.invited().
        execute(function(resp){});
},200);
};