Angularjs 在iframe中扩展$rootScope.$广播

Angularjs 在iframe中扩展$rootScope.$广播,angularjs,Angularjs,我正试图解决这样一个问题:我有一个用AngularJS构建的页面和一个需要相同的域iframe的特性,这个域iframe也是有角度的 我想要实现的是使用$rootScope.$broadcast从iframe广播消息,使其到达父帧 我想做这样的事情: app.config(['$provide', function ($provide) { $provide.decorator('$rootScope', ['$delegate', function ($delegate) {

我正试图解决这样一个问题:我有一个用AngularJS构建的页面和一个需要相同的域iframe的特性,这个域iframe也是有角度的

我想要实现的是使用$rootScope.$broadcast从iframe广播消息,使其到达父帧

我想做这样的事情:

app.config(['$provide', function ($provide) {
  $provide.decorator('$rootScope', ['$delegate', function ($delegate) {
        var native = $delegate.$broadcast;
        $delegate.$broadcast = function (name, args) {
            if (window.frameElement) {
                console.log("Broadcast inside a frame");
                // Here I would do window.postMessage
            } else {
                console.log("Broadcast outside a frame");
            }
            return native;
        }
    return $delegate;
}]);

但这会产生一个角度误差。有没有关于修复此错误的建议?有没有更好的方法来做我想做的事?

我想这就是你想要的。关于“this”的值的问题,您是对的,将$broadcast副本存储到$delegate似乎可以解决问题

这是做同样事情的另一种方式。(我把它放在这里,因为这是我在装潢版开始工作之前的原始答案。)


您得到的错误是什么?请定义“爆炸”错误是什么?这样怎么样?我收到一个错误,表示无法读取未定义的属性“$$listeners”。我认为这是因为$broadcast使用'this'并设置native=$delegate。$broadcast正在$broadcast内更改此上下文。您的plunker似乎打破了$rootScope。$的场景。我认为需要的是将旧广播消息保存到$delegate对象并调用它。有什么原因可能是个坏主意吗?@Valchris是的,当您传入
$delegate.$broadcast
的函数引用时,不会有任何上下文。是的,你需要这样做。然而,无论如何,我都无法复制这种情况。无论如何,如果这是个问题,为什么不把它变成一个绑定函数呢
oldbroadcast=$delegate.$broadcast.bind($delegate)
oldbroadcast=angular.bind($delegate.$broadcast,$delegate)
app.config(['$provide', function ($provide) {

   $provide.decorator('$rootScope', ['$delegate', '$window', function ($delegate, $window) {

     $delegate.native = angular.copy($delegate.$broadcast);

     $delegate.$broadcast = function (name, args) {

       if ($window.parent) {
            $window.parent.postMessage(args, '*');
            console.log("Broadcast inside a frame");
            // Here I would do window.postMessage
        } else {
            console.log("Broadcast outside a frame");
        }

        $delegate.native(name, args);

        return $delegate.native;
    }

   return $delegate;

  }]);

}]);
app.run(function($rootScope, $window){

    $rootScope.oldBroadcast = angular.copy($rootScope.$broadcast);

    $rootScope.$broadcast = function (name, args) {

        if ($window.parent) {
            $window.parent.postMessage(args, '*');
            console.log("Broadcast inside a frame", name, args);
            // Here I would do window.postMessage
        } else {
            console.log("Broadcast outside a frame");
        }

        $rootScope.oldBroadcast(name, args);

        return $rootScope.oldBroadcast;

    }

});