2017-05-31 114 views
-1

我想访问我的角度控制器的范围以外的控制器。我正在使用外部js库执行某些操作,并在完成时执行某些回调。在其中一个回调angular.element(document.findElementById('elementId').scope()返回undefined。 但是在第一个 angular.element(document.findElementById('elementId').scope()返回有效范围之后执行的第二个回调中。angular.element(..)。scope()首先返回undefined

下面是一些示例代码

<body id="authcontroller" ng-controller="AuthenticationController as auth"> 

<script> 
    window.externalLibObj = { 
    onCallback1: function(){ 
     // Undefined value for scope 
     var scope = angular.element(document.getElementById('authcontroller')).scope(); 
    }, 
    onCallback2(): function(){ 
     // Valid value for scope 
     var scope = angular.element(document.getElementById('authcontroller')).scope(); 
    } 
    }; 
</script> 
    </body> 

其中这些回调的执行顺序是onCallback1然后onCallback2var scope未定义在onCallback1但为什么在onCallback1未定义scopeonCallback2

的值?

感谢您的帮助

+0

你也可以说是调用这些回调的代码? –

+0

@PeterLaBanca调用这些回调的代码在js lib加载后自动执行,我从不明确调用调用这些回调的代码 –

+0

这两个回调是否立即执行?这听起来像是一个时间问题,在第二次回调被调用之前,范围还没有准备好。 –

回答

0

这似乎是一个计时问题。当你的第一个回调被执行时,范围没有准备好,但是它在你的第二个回调中。当关联视图正确加载时,您应该更改逻辑并触发控制器内的回调。

在你AuthenticationController补充一点:

$scope.$on('$viewContentLoaded', function(){ 
    // here define/fire your callbacks and you will be sure that everything is init 
}); 

我希望它能帮助

+0

不幸的是,我不能控制回调何时被触发,因为它们一旦被自动触发js lib我正在使用负载。似乎我需要找出一些其他方式才能使其发挥作用。 –

+0

尝试使用承诺并解决我在上面发布的控制器事件中的承诺。在你的回调中,你需要的代码放在那个promise的'then'中,当控制器初始化的时候你将会执行你的代码。是否有意义? – quirimmo

+0

能够得到它的工作。感谢你的帮助! –