2014-10-02 65 views
2

我試圖解決這個問題,我有一個使用AngularJS構建的頁面,並且需要一個同樣是角度的同一個域名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; 
}]); 

但這吹了一個角度誤差。有關修復此錯誤的任何建議?有沒有更好的方法來做我想找的?

+0

什麼是你的錯誤? – PaulParton 2014-10-02 00:16:42

+0

_請定義「爆炸」_什麼是錯誤?這樣呢? http://plnkr.co/edit/B70D8S?p=preview – PSL 2014-10-02 00:22:53

+0

我收到一個錯誤,提示無法讀取未定義的屬性'$$ listeners'。我認爲這是因爲$ broadcast使用'this'並且設置native = $ delegate。$ broadcast正在改變這個內部的上下文$ broadcast – Valchris 2014-10-02 00:32:53

回答

2

我想這是你以後的樣子。你說得對,與「本」的價值問題是,存儲$廣播複製到$代表似乎這樣的伎倆

http://plnkr.co/edit/KW3whFtuu9C9Tvjo4kdS?p=preview

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; 

    }]); 

}]); 

這是另一種方式做同樣的事情。 (我離開這裏,因爲這是我原來的答覆之前,我得到的裝飾版的工作。)

http://plnkr.co/edit/s5qNtva1l0SJVV2y0Onk?p=preview

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; 

    } 

});