2017-08-04 14 views
0

WebSocketからの新しいデータが別のフレームで受信されたときに角度テーブルを作成する必要があるparent.postMessage( "printComments"、 "*" 「):イベントに応答してデータがロードされたときにアンロード角度テーブルが機能しない

var app = angular.module('myapp', []); 
 
var printOperation; 
 

 
function GetFromLocalStorage(key) { 
 
    var items = localStorage.getItem(key); 
 
    console.log(items); 
 
    if (items === null) { 
 
     console.log("item null"); 
 
     return null; 
 
    } else { 
 
     if (typeof items != "string") { 
 
      items = JSON.stringify(items); 
 
     } 
 
     return items; 
 
    } 
 
} 
 

 
app.controller('MyCtrl', 
 
    function ($scope) { 
 
     $scope.printComments = function() { 
 
      //$scope.obj=GetFromLocalStorage("AllComments"); 
 
      $scope.obj = [{ 
 
       "nome": "first", 
 
       "status": 1, 
 
       "testo": "Rottura rullo 1!!!" 
 
      }, { 
 
       "nome": "second", 
 
       "status": 0, 
 
       "testo": "Rottura rullo fsdfsf!!!" 
 
      }]; 
 
      console.log("ricevo evento e ricarico tabella"); 
 
      console.log($scope.obj); 
 
     }; 
 

 
     console.log("assegno print operation"); 
 
     printOperation = $scope.printComments; 
 
     printOperation(); 
 
    } 
 
); 
 
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent"; 
 
var eventer = window[eventMethod]; 
 
var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message"; 
 
eventer(messageEvent, function (e) { 
 
    console.log("ricevo messaggio"); 
 
    printOperation(); 
 
}, false); \t \t
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.2/angular.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div ng-controller="MyCtrl" ng-app="myapp"> 
 
<table ng-table="commentsTable"> 
 
    <tr ng-repeat="item in obj track by $index"> 
 
    <td class="plantCell">{{item.nome}}: </td> 
 
    <td class="statusCell">{{item.status}}</td> 
 
    <td class="statusCell">{{item.testo}}</td> 
 
    </tr> 
 
</table> 
 
</div>

私は内部スコープ機能printOperationを呼び出す場合は私がイベント、テーブルを受信したときは逆に、私はそれを呼び出す場合は、テーブルが正しく更新され、は更新されていない。 SwiftやJavaのプログラムであれば、私はバックグラウンドスレッドだと思うでしょう.Javascriptにそのような概念がありますか?メインスレッドにはどうやって来ますか?

+0

私はあなたがそれを実行なっている間に定義されていない角度外printOperation()以来、コールバックを使用することがあると思う:これは、すべての種類の提案を集める作業溶液です。ですから、どういうわけか、角度実行が終了するのを待たなければなりません。 – Vivz

+0

いいえ、printOperation関数内のコンソールメッセージは実際に出力されるので、ロードされるだけでなく実行されます。これは、イベントが送信されたときにイベントがかなり遅れて到着している間に、テーブルがロードされるとすぐにスコープ関数が実行されるので非常に自然です。 –

+0

printOperation()を配置してから実行されます。角度の範囲内にある。それを外に置いてみると、私が言っていることを理解することができます。 – Vivz

答えて

0

(イベントリスナーの)AngulraJSスコープ外のデータを更新しようとしているため、更新された値が表示されません。明示的に消化サイクルを開始するには、関数呼び出しを$applyまたは'$applyAsync'でラップする必要があります。作業例を参照してください:すべての人に

var app = angular.module('myapp', []); 
 

 
app.controller('MyCtrl', 
 
    function ($scope) { 
 
     //initial data 
 
     $scope.obj = [{ 
 
       "nome": "first", 
 
       "status": 1, 
 
       "testo": "Rottura rullo 1!!!" 
 
      }]; 
 
      
 
     //this changes data 
 
     $scope.printComments = function() { 
 
      //$scope.obj=GetFromLocalStorage("AllComments"); 
 
      $scope.obj = [{ 
 
       "nome": "first", 
 
       "status": 1, 
 
       "testo": "Rottura rullo 1!!!" 
 
      }, { 
 
       "nome": "second", 
 
       "status": 0, 
 
       "testo": "Rottura rullo fsdfsf!!!" 
 
      }]; 
 
      console.log("ricevo evento e ricarico tabella"); 
 
      console.log($scope.obj); 
 
     }; 
 
     
 
     var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent"; 
 
     var eventer = window[eventMethod]; 
 
     var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message"; 
 
     eventer(messageEvent, function (e) { 
 
      console.log("ricevo messaggio"); 
 
      //kick in $digest 
 
      $scope.$apply($scope.printComments); 
 
     }, false); \t 
 
     
 
     //emulate message in 3 secs 
 
     setTimeout(function(){ window.dispatchEvent(new Event(messageEvent)); }, 3000); 
 
    } 
 
);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.2/angular.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div ng-controller="MyCtrl" ng-app="myapp"> 
 
    <table> 
 
    <tr ng-repeat="item in obj track by $index"> 
 
     <td class="plantCell">{{item.nome}}: </td> 
 
     <td class="statusCell">{{item.status}}</td> 
 
     <td class="statusCell">{{item.testo}}</td> 
 
    </tr> 
 
    </table> 
 
</div>

+0

@FabrizioBartolomucciどのAngularJSバージョンを使用していますか? –

+0

Uncaught TypeError:$ scope。$ applyAsyncとなり、ただ1つの行が2つ表示されます。また、Uncaught TypeError:$(...)。resizableはコードの別の部分です。 –

+0

https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js 他にもありますか? –

0

感謝を。

<head> 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.5/angular.min.js"> 
</script> 
</head> 

<body> 
<html> 
     <div ng-controller="MyCtrl" ng-app="myapp"> 
     <table ng-table="commentsTable"> 
      <tr ng-repeat="item in obj track by $index"> 
       <td class="plantCell">{{item.nome}}: </td> 
      <td class="statusCell">{{item.status}}</td> 
      <td class="statusCell">{{item.testo}}</td> 
     </tr> 
     </table> 
     </div> 
     <script language="javascript"> 
      var app=angular.module('myapp', []); 
      var printOperation; 
      function GetFromLocalStorage(key) { 
       var items=localStorage.getItem(key); 
       console.log(items); 
       if (items===null){ 
        console.log("item null"); 
        return null; 
       } else { 
        items = JSON.parse(items); 
        return items; 
       } 
      } 
      var app = angular.module('myapp', []); 

      app.controller('MyCtrl', 
        function ($scope) { 
        $scope.printComments = function() { 
          $scope.obj=GetFromLocalStorage("AllComments"); 
        console.log("ricevo evento e ricarico tabella"); 
        console.log($scope.obj); 
        }; 
        var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent"; 
        var eventer = window[eventMethod]; 
        var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message"; 
        eventer(messageEvent, function (e) { 
          console.log("ricevo messaggio"); 
          $scope.$applyAsync($scope.printComments); 
        }, false); 
       } 
     );  
     </script> 

+0

あなたは私の答えを受け入れるべきではありませんか?それは元の問題を解決して以来、他の問題は質問の本体でコメントさえされていて、質問そのものにも関連していない 'GetFromLocalStorage'メソッドによって得られました。 –

関連する問題