Angularjs: appeler d'autres scope qui dans iframe

dans mon test, donné 2 document, A et B. Dans un document, il y a une iframe, la source d'iframe est le document B. Ma question Est de savoir comment modifier un document B pour une certaine portée de variable?

Voici mon code: un document

<html lang="en" ng-app="">
<head>
  <meta charset="utf-8">
  <title>Google Phone Gallery</title>
  <script type='text/javascript' src="js/jquery-1.10.2.js"></script>
  <script type='text/javascript' src="js/angular1.0.2.min.js"></script>
  <script>
  var g ;
function test($scope,$http,$compile)
{
    $scope.tryget = function(){

        var iframeContentWindow = $("#iframe")[0].contentWindow;
        var iframeDOM = $("#iframe")[0].contentWindow.document;
        var target = $(iframeDOM).find("#test2");
        var iframeAngular = iframeContentWindow.angular;
        var iframeScope = iframeAngular.element("#test2").scope();
        iframeScope.parentcall();
        iframeContentWindow.angular.element("#test2").scope().tempvalue = 66 ;
        iframeScope.tempvalue = 66;
        iframeContentWindow.tt = 22;
        iframeScope.parentcall();
        console.log(iframeScope.tempvalue);
        console.log(angular.element("#cont").scope());
    }
}

  </script>
</head>
<body>

<div ng-controller="test">
        <div id="cont" >
            <button ng-click="tryget()">try</button>
        </div>
</div>
<iframe src="test2.html" id="iframe"></iframe>

</body>
</html>

My B document:

<!doctype html>
<html lang="en" ng-app="">
<head>
  <meta charset="utf-8">
  <title>Google Phone Gallery</title>
  <script type='text/javascript' src="js/jquery-1.10.2.js"></script>
  <script type='text/javascript' src="js/angular1.0.2.min.js"></script>
  <script>
var tt =11;
function test2($scope,$http,$compile)
{
    console.log("test2 controller initialize");
    $scope.tempvalue=0;
    $scope.parentcall = function()
    {
        $scope.tempvalue = 99 ;
        console.log($scope.tempvalue);
        console.log(tt);
    }
}

  </script>
</head>
<body>

<div ng-controller="test2" id="test2">
        <div id="cont" >
            <button ng-click="parentcall()">get script</button>
        </div>
        {{tempvalue}}
</div>

</body>
</html>

Note: En fait il y a un moyen de le faire, que je sens comme un hack au lieu de la bonne façon de le faire: c'est créer un bouton dans le Document b, puis lier avec angularjs ng-cliquez. Après cela, un document jquery "trigger" cliquez sur le bouton.

24
demandé sur Stupidfrog 2013-08-26 10:03:41

3 réponses

pour accéder et communiquer dans deux directions (parent à iFrame, iFrame à parent), dans le cas où ils sont tous les deux dans le même domaine, avec accès à la portée angulaire, essayez de suivre ces étapes:

*Vous n'avez pas besoin du parent de faire référence à angularJS la bibliothèque...

Appel à l'enfant iFrame du parent

1.Obtenez de l'enfant iFrame élément de la mère ( "151990920 lien" répondre ):

document.getElementById ("myIframe").contentWindow

2.Accédez à la portée de l'élément:

document.getElementById ("myIframe").contentWindow.anguleux.element ("#someDiv").champ d'application ()

3.Appelez la fonction ou la propriété de la portée:

document.getElementById ("myIframe").contentWindow.anguleux.element ("#someDiv").portée.)(someAngularFunction (data);

4.Appelons $champ d'application.$ apply après avoir exécuté la logique de la fonction / mise à jour de la propriété ( lien vers la réponse de Mishko ):

$champ d'application.$s'appliquent(function () { });

  • une autre solution est de partager la portée entre les iFrames, mais alors vous avez besoin angulaire dans les deux côtés: ( lien pour répondre et exemple )

l'Appel des parents de l'enfant iFrame

  1. appelant la fonction parent:

parent.someChildsFunction ();

mettra à jour également sur la façon de le faire cross domaine si elle est nécessaire..

45
répondu Urigo 2017-05-23 10:31:10

vous devriez être en mesure d'obtenir la portée parent de iFrame:

var parentScope = $window.parent.angular.element($window.frameElement).scope();

alors vous pouvez appeler la méthode parent ou changer la variable parent( mais n'oubliez pas d'appeler parentScope.$apply pour synchroniser les changements)

testé sur L'angle 1.3.4

13
répondu Yiding 2014-12-02 17:27:22

la meilleure façon de communiquer avec l'iframe est d'utiliser window.haut. Si vous voulez que votre iframe obtienne le scope de votre parent, vous pouvez définir window.scopeToShare = $scope; dans votre controller et il devient accessible pour la page iframe à window.top.scopeToShare .

si vous voulez que votre parent obtienne le champ iframe, vous pouvez utiliser

window.receiveScope = function(scope) {
  scope.$on('event', function() {
    /* Treat the event */
  }
};

et dans le contrôleur iframe appel window.top.giveRootScope($rootScope);

avertissement: si vous utilisez ce contrôleur plusieurs fois, assurez-vous d'utiliser un ID supplémentaire pour identifier quel scope vous voulez.

3
répondu Benoit Tremblay 2013-11-02 16:21:48