angular js中如何在外部插件访问内部页面的scope?

项目中需要在ckeditor toolbar上的插件中访问到页面内部的一些变量或者定义的接口,在网上查了下,找到了一种有效的方法,现作为笔记以ckeditor中的插件为例。

1、在外部插件例如ckeditor的plugin.js中添加如下代码

angular.$externalBroadcast = function (selector, event, message) {
    var scope = angular.element(selector).scope();
    scope.$apply(function () {
        scope.$broadcast(event, message);
    });
};

其中三个参数分别是你要访问的元素和$broadcast的两个参数。在外部插件中利用$apply监控scope中的变量等等,并且用$broadcast给内部页面发出触发信号(例如点击,滑动等等)。例如:

项目中在ckeditor toolbar中按钮(也就是插件)的点击事件中添加如下代码

angular.$externalBroadcast = function (selector, event, message) {
    var scope = angular.element(selector).scope();
    scope.$apply(function () {
        scope.$broadcast(event, message);
    });
};
angular.$externalBroadcast('#pageContainer', 'messagePreview', previewType);

我想访问的是整个页面的内容,所以第一个参数选中了整个页面最外层的元素,剩下两个参数是传的一些值。剩下要做的就是接受外部访问信号的代码:

2、在内部页面的控制器中添加接收信号的代码

$rootScope.$on('messagePreview', function(event,data) {
    // handle the external event.
});

此时在里面,就可以做自己想做的事了,并且也可以顺利的访问到页面的所有内容。项目中为了减少页面controller的代码量,我给ckeditor新建了一个controller,在这个controller里放了$on。

3、个人总结

  这个方法的简单来说就是在外部给内部页面发出信号,内部页面接收到信号后做想做的事,其实要做的事还是在页面内部,并不是真正的把页面内部的变量拿到了外部使用。

4、原文链接(记得FQ哦)