【发布时间】:2017-08-04 19:17:15
【问题描述】:
当通过调用 parent.postMessage("printComments", "*") 在另一个框架中接收到来自 websocket 的新数据时,我需要填充一个角度表:
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>
如果我在作用域函数内部调用 printOperation,则表会正确更新,如果相反,当收到事件时调用它,则表不会更新.如果是 Swift 或 Java 程序,我会认为我在后台线程上,Javascript 中是否有这样的概念,我如何进入主线程?
【问题讨论】:
-
我认为您必须使用回调,因为角度之外的 printOperation() 在执行时未定义。因此,您必须以某种方式等待 angulars 执行结束。
-
不,printOperation函数内部的控制台消息实际上是打印出来的,所以它不仅被加载,而且被执行。这是很自然的,因为一旦加载表就会执行范围函数,而事件在发送事件时到达的时间要晚得多。
-
自从你放置了 printOperation();在角度范围内。试着把它放在外面然后你就会明白我在说什么。
-
不幸的是,该函数设置了角度表使用的数组。所以它必须位于范围内。
标签: javascript angularjs multithreading html-table