tablas pasar parametros formularios eventos entre dinamicas comunicacion componentes javascript angularjs multithreading html-table

javascript - pasar - Volver a cargar la tabla angular no funciona cuando los datos se cargan en respuesta a un evento



pasar parametros entre componentes angular 4 (2)

Necesito rellenar una tabla angular cuando los datos nuevos de un websocket se reciben en otro marco al llamar 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);

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

Si llamo a printOperation dentro de la función de alcance, la tabla se actualiza correctamente, si en el reverso la llamo cuando recibo el evento , la tabla no se actualiza. Si se tratara de un programa Swift o Java, creo que estoy en un hilo de fondo, ¿existe ese concepto en Javascript y cómo llego al hilo principal?


Está intentando actualizar los datos fuera del alcance de AngulraJS (en el detector de eventos) y es por eso que la vista no muestra los valores actualizados. Debe completar su llamada de función con $apply o ''$ applyAsync'' para comenzar el ciclo de digestión de forma explícita. Vea un ejemplo de trabajo:

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); //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>


Gracias a todos. Esta es la solución de trabajo que recopila todas las sugerencias amables:

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