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