更安全、更高效的方法,尤其是在调试数据关闭时,是使用共享变量来保存回调函数。您的角度控制器实现此功能以将其内部返回给外部代码。
var sharedVar = {}
myModule.constant('mySharedVar', sharedVar)
mymodule.controller('MyCtrl', [ '$scope','mySharedVar', function( $scope, mySharedVar) {
var scopeToReturn = $scope;
$scope.$on('$destroy', function() {
scopeToReturn = null;
});
mySharedVar.accessScope = function() {
return scopeToReturn;
}
}]);
概括为可重用指令:
我创建了一个“exposeScope”指令,它以类似的方式工作,但使用更简单:
<div ng-controller="myController" expose-scope="aVariableNameForThisScope">
<span expose-scope='anotherVariableNameForTheSameScope" />
</div>
这将当前范围(赋予指令的链接函数)存储在全局“范围”对象中,该对象是所有范围的持有者。提供给指令属性的值用作此全局对象中范围的属性名称。
在此处查看演示。正如我在演示中所展示的,当范围从全局“范围”对象中存储和删除时,您可以触发 jQuery 事件。
<script type="text/javascript" >
$('div').on('scopeLinked', function(e, scopeName, scope, allScopes) {
// access the scope variable or the given name or the global scopes object
}.on('scopeDestroyed', function(e, scopeName, scope, allScopes) {
// access the scope variable or the given name or the global scopes object
}
</script>
请注意,当实际元素从 DOM 中删除时,我没有测试 on('scopeDestroyed') 。如果它不起作用,则在文档本身而不是元素上触发事件可能会有所帮助。(参见 app.js )演示插件中的脚本。