当AngularJS控制器遇到postMessage事件

When AngularJS controller meets postMessage events

我有以下使用 AngularJS 和消息侦听器的代码:JSBin:

<!DOCTYPE html> 
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<body>
  <div ng-app="myApp" ng-controller="myCtrl">
    <input type="text" ng-model="Name"><br>
    <br>
    <textarea id="myText" ng-model="Name"></textarea>
  </div>
  <br>
  <span id="fromQuery"></span>

  <script>
    var prefix = "pre-";
    var app = angular.module('myApp', []);
    app.controller('myCtrl', function($scope) {
      function render() {
        document.getElementById("fromQuery").innerHTML = prefix + $scope.Name  
      }

      $scope.Name = "John";

      $scope.$watch('Name', function() {
        render();
      })
    });

    function receiveMessage(event) {
      prefix = event.data;
    }

    window.addEventListener("message", receiveMessage, false);
  </script>
</body>
</html>

AngularJS 定义了一个控制器,它允许同步所有内容:对 inputtextarea 的任何更改都会影响 inputtextareaspan。我还有一个全局变量 prefix,它总是为 inputtextarea 的内容添加一个前缀,并将其显示在 span.

使情况复杂化的是听众。另一个网页将向该网页发送新的前缀(抱歉,我无法在此处显示测试)。目前,一旦页面接收到新的前缀,由于函数范围的原因,它不能调用 render,因此 span 不会用新的前缀刷新。我想知道的是,一旦页面收到新前缀,它就会系统地刷新 span 和新前缀。

有谁知道如何实现这个?

angular 脚本:使用 $window

    var app = angular.module('myApp', []);
    app.controller('myCtrl', function ($scope, $window) {
        $scope.prefix = "abc";//if prefix needs to change dynamically why not add it to scope ?
        function render() {
            document.getElementById("fromQuery").innerHTML = $scope.prefix + $scope.Name
        }

        $scope.Name = "John";

        function receiveMessage(event) {
            console.log(event.detail); //just checking
            $scope.$apply(function(){          
                $scope.prefix = event.detail;
             })
            //$scope.prefix = event.detail;
        }

        $window.addEventListener("message", receiveMessage, false);

        $scope.$watch('Name', function () {
            render();
        })
       $scope.$watch('prefix', function() {
        console.log('prefix changed');
       render();
       })
    });

html + 测试脚本

<button type='button' onclick="doo()">TEST</button>

-

function doo() {
    var event = new CustomEvent('message', {
            'detail' : 'MyNewPrefix'
        });
    window.dispatchEvent(event);
}

如果这不是您想要的,请告诉我们。