首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用javascript函数中在指令中定义的控制器中的方法

调用javascript函数中在指令中定义的控制器中的方法
EN

Stack Overflow用户
提问于 2014-09-24 13:58:09
回答 2查看 208关注 0票数 1

我正在寻找一种方法来调用在全局函数的指令中定义的控制器中的方法。我能够成功地做到这一点,在模块中定义控制器,并在普通html元素中使用ng控制器声明控制器。然后,我从javascript函数获得控制器和作用域,如下所示:

代码语言:javascript
复制
function signinCallback(authResult) {
    var googleLoginControllerElement = document.getElementById('googlelogin');
    var ctrlScope = angular.element(googleLoginControllerElement).scope();
    var controller = angular.element(googleLoginControllerElement).controller();

    ctrlScope.$apply(function() {
        controller.signinCallBack(authResult);
    });
}

但是,当我将控制器的定义移到指令的定义时,我无法找到这样做的方法(将控制器定义移动到指令后的新代码):

代码语言:javascript
复制
var googleLogin = angular.module('GoogleLogin', []);

googleLogin.directive('googleLogin', function() {
    return {

    restrict: 'E',
    controller: function() {
    // Initialize google login api
    (function() {
        var po = document.createElement('script'); 
        po.type = 'text/javascript';
        po.async = true;
        po.src = 'https://apis.google.com/js/client:plusone.js';
        var s = document.getElementsByTagName('script')[0];
        s.parentNode.insertBefore(po, s);
     })();

         /*
         * 1: not logged in.
         * 2: logged in.
         * 3: login failed.
         * 4: logout failed.
         */
         this.state = 1;

         this.signinCallBack = function(authResult) {
         if (authResult['status']['signed_in']) {
             console.log('authResult: ' + JSON.stringify(authResult));
             this.state = 2;
         } else if (authResult.error === "user_signed_out") {
             console.log('Sign-in state: ' + authResult['error']);
                 this.state = 1;
         }
        };

        this.logout = function() {
            try {
                gapi.auth.signOut();
                this.state = 1;
             } catch(e) {
                 this.state = 4;
             }
        };

        this.isLoggedIn = function() {
            return this.state == 2;
        };
    },
    controllerAs: 'googleLoginCtrl',
    templateUrl: '../templates/google_login.html'
};
});

在我的html中,我使用了如下指令:

代码语言:javascript
复制
<google-login></google-login>

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-24 14:45:10

您需要指定指令必须使用的范围。

请参阅以下文档:https://docs.angularjs.org/guide/directive

**编辑:**

我给了你的元素一个id,这样我就可以访问它。

代码语言:javascript
复制
<google-login id="mybtn"></google-login>

&更改了您的全局功能。

代码语言:javascript
复制
function signinCallback(authResult) {
//  alert('I came here also inside callback global');

  var googleLoginControllerElement = document.getElementById('mybtn');
  var ctrlScope = angular.element(googleLoginControllerElement).scope();

 ctrlScope.$apply(function() {
      ctrlScope.googleLoginCtrl.signinCallBack(authResult);
     });

  //      ctrlScope.googleLoginCtrl.signinCallBack(authResult);
  //alert('I came here also inside callback global end');

}

我正在尝试ctrlScope.controller,但监督给它起了一个名字。

票数 0
EN

Stack Overflow用户

发布于 2014-09-24 14:42:13

您可以尝试这样的方法(我不确定它是否有效,请告诉我):

代码语言:javascript
复制
window.globalSigninCallBack = this.signinCallBack;

在您的指令中:

代码语言:javascript
复制
googleLogin.directive('googleLogin', function() {
    return {

    restrict: 'E',
    controller: function() {
    // Initialize google login api
    (function() {
        var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
        po.src = 'https://apis.google.com/js/client:plusone.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
        })();

         /*
         * 1: not logged in.
         * 2: logged in.
         * 3: login failed.
         * 4: logout failed.
         */
         this.state = 1;

         this.signinCallBack = function(authResult) {
         if (authResult['status']['signed_in']) {
             console.log('authResult: ' + JSON.stringify(authResult));
             this.state = 2;
         } else if (authResult.error === "user_signed_out") {
             console.log('Sign-in state: ' + authResult['error']);
                 this.state = 1;
         }
        };

        window.globalSigninCallBack = this.signinCallBack;

        this.logout = function() {
            try {
                gapi.auth.signOut();
                this.state = 1;
             } catch(e) {
                 this.state = 4;
             }
        };

        this.isLoggedIn = function() {
            return this.state == 2;
        };
    },
    controllerAs: 'googleLoginCtrl',
    templateUrl: '../templates/google_login.html'
};
});

然后在后面的代码调用中:

代码语言:javascript
复制
window.globalSigninCallBack(authResult);

但是这是非常麻烦的解决方法,我永远不会在我的代码中使用这个:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26018812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档