Angularjs: вызов другой области действия, которая в iframe

В моем тесте, учитывая 2 документа, A и B. В документе есть iframe, источник iframe - это B-документ. Мой вопрос заключается в том, как изменить B-документ на определенную область переменной?

Вот мой код: документ

<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>

Мой документ B:

<!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>

Примечание. На самом деле есть способ сделать это, и я чувствую, что это как взломать вместо правильного способа сделать это: это создать кнопку в документе b, а затем привязать с помощью angularjs ng-click. После этого документ jquery "триггер" нажимает кнопку.

Ответ 1

Для доступа и обмена данными в двух направлениях (родительский для iFrame, iFrame для родителя), если они находятся в одном домене с доступом к области angular, выполните следующие шаги:

* Вам не нужен родитель, чтобы иметь ссылку на библиотеку angularJS...

Вызов дочернего iFrame из родительского

1. Установите дочерний элемент iFrame из родительского (ссылка для ответа):

document.getElementById( "myIframe" ). ContentWindow

2.Примените область действия элемента:

document.getElementById( "myIframe" ). ContentWindow.angular.element( "# someDiv" ). Объем()

3.Установите функцию или свойство областей:

document.getElementById( "myIframe" ) contentWindow.angular.element( "# someDiv" ) Объем() someAngularFunction (данные);...

4.Call $scope. $apply после запуска логики функции/обновления свойства (ссылка на ответ Мишко):

$scope. $apply (function() {});

  • Другим решением является разделение области между iFrames, но тогда вам нужно angular с обеих сторон: (ссылка на ответ и пример)

Вызов родителя из дочернего iFrame

  • Вызов родительской функции:

parent.someChildsFunction();

Будет также обновляться и о том, как это сделать, перекрестный домен, если это необходимо.

Ответ 2

Вы можете получить родительскую область из iFrame:

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

Затем вы можете вызвать родительский метод или изменить родительскую переменную (но не забудьте вызвать parentScope.$apply, чтобы синхронизировать изменения)

Протестировано на Angular 1.3.4

Ответ 3

Лучший способ, с которым я хочу общаться с iframe, - использовать window.top. Если вы хотите, чтобы ваш iframe получил вашу родительскую область, вы можете установить window.scopeToShare = $scope; в свой контроллер и стать доступным для страницы iframe в window.top.scopeToShare.

Если вы хотите, чтобы ваш родитель получил область iframe, вы можете использовать

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

и внутри вызова контроллера iframe window.top.giveRootScope($rootScope);

ПРЕДУПРЕЖДЕНИЕ. Если вы используете этот контроллер несколько раз, убедитесь, что используете дополнительный идентификатор, чтобы определить, какую область вы хотите.