【问题标题】:Calling Angular service from outside JS via .scope().call() hangs request通过 .scope().call() 从 JS 外部调用 Angular 服务会挂起请求
【发布时间】:2013-09-19 23:41:21
【问题描述】:

我正在向我的 Angular 应用程序添加一个 Google+ 登录按钮,除了回调结果的处理之外,其中大部分都在工作。 G+ 登录的回调是一个名为 signinCallback 的外部 JS 函数,如下所示:

//Handling the Google+ Signin right here
function signinCallback(authResult) {
angular.element($("#btnGooglePlus")).scope().handleGoogleSignin(authResult);
}

我能弄清楚如何将authResult 传回控制器的唯一方法是通过element.scope() 调用控制器方法。 handleGoogleSignin 调用正常,在该函数内部有一个 http.get 服务调用,如下所示:

User.getSocialKey(key).then(function(data) {
    console.log(data);
});

User 是一个服务,getSocialKey 看起来像:

getSocialKey: function(etag) {
    console.log("Hit the social key service with the etag: " + etag);
    return $http({
        url: '/api/user/social',
        method: 'post',
        data: {etag:etag}
    }).then(function(result) {
        console.log("Returning promise from social service");
        return result.data;
    });
},

第一个日志语句被击中,然后什么都没有。请求永远不会发送。现在,如果我在页面上单击具有ng-model 属性的某些内容(例如,复选框),那么请求就会被发送和接收。所以我的问题是:为什么我的 Angular 服务调用会被暂停,直到我点击某些东西?为什么不马上通过?

我尝试用有效的服务调用替换getSocialKey,同样的事情。我相信问题归结为使用angular.element($("#btnGooglePlus")).scope().handleGoogleSignin(authResult); 调用函数,但我不确定。有人见过这个吗?

【问题讨论】:

    标签: javascript ajax angularjs google-plus


    【解决方案1】:

    抱歉,我无法测试,但我认为您应该致电 .$apply(),因为该操作是在 AngularJS 范围之外触发​​的。

    function signinCallback(authResult) {
        angular.element($("#btnGooglePlus")).scope().handleGoogleSignin(authResult);
        angular.element($("#btnGooglePlus")).scope().$apply();
    }
    

    【讨论】:

    • 这似乎是正确的;另请参阅有关此问题的 cmets:stackoverflow.com/questions/18436385/…
    • 嗯,这会引发Uncaught TypeError: Object #<Object> has no method 'apply' 错误。所以,我认为问题是因为一个$digest 循环从未启动,所以请求只是停滞不前。到目前为止,我可以通过在控制器的handleGoogleSignin 方法中调用$scope.$digest() 来解决问题。这是正确的吗?看起来很草率。
    • 小错误:是$apply(),不是apply(),否则这应该是解决方案。
    • @NikosParaskevopoulos 谢谢。已更新。
    • @sza -- 我一回到家就试试这个……几个小时左右。届时将更新。
    猜你喜欢
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 2021-01-30
    相关资源
    最近更新 更多