从 websocket 服务器推送消息后更新 $scope 变量
Updating $scope variable after push message from websocket server
我连接到一个将消息推送到我的 angularJS 应用程序的 websocket 服务器。我在服务中收到这些消息,现在我想 public 在 gui 上显示这些数据。
angular.module("test", [])
.value("DATA", [])
.service("WSS", ["$rootScope", "DATA", function ($rootScope, DATA) {
//initialise websocket here
m_WebSocket.onmessage = function (msg) {
$rootScope.$apply(function () {
DATA = angular.fromJson(msg.data).slice();
});
console.debug(DATA); //gives me the expected result
};
}])
.controller("CTRL", ["$scope", "DATA", function ($scope, DATA) {
$scope.data = DATA;//wont update
}]);
因此,据我了解 angular 我认为它必须以这种方式工作,但我的数据数组仍然是空的。我在这里错过了什么?
问题是,当你分配DATA = angular.fromJson(msg.data).slice();
时,它根本不会影响$scope.data = DATA;
,因为$scope.data
和服务中的新DATA
数组没有连接,他们指向不同的对象。我们说它们之间没有引用。所以它也不会在视图中更新。
如果您只是更改对象的 属性 而不是完全覆盖对象引用,则修复起来非常容易:
angular.module("test", [])
.value("DATA", {values: []})
.service("WSS", ["$rootScope", "DATA", function ($rootScope, DATA) {
//initialise websocket here
m_WebSocket.onmessage = function (msg) {
$rootScope.$apply(function () {
DATA.values = angular.fromJson(msg.data).slice();
});
};
}])
.controller("CTRL", ["$scope", "DATA", function ($scope, DATA) {
$scope.data = DATA;
}]);
然后在模板中,您将使用 data.values
而不是像以前那样只使用 data
。
在这种情况下,$scope.data
是一个具有 属性 values
的对象。当新消息来自服务器时,唯一改变的是 DATA
对象的 属性 values
。但是在控制器中 $scope.data
指向 相同的 对象,因此 Angular 将能够获取选定的新数据。
我连接到一个将消息推送到我的 angularJS 应用程序的 websocket 服务器。我在服务中收到这些消息,现在我想 public 在 gui 上显示这些数据。
angular.module("test", [])
.value("DATA", [])
.service("WSS", ["$rootScope", "DATA", function ($rootScope, DATA) {
//initialise websocket here
m_WebSocket.onmessage = function (msg) {
$rootScope.$apply(function () {
DATA = angular.fromJson(msg.data).slice();
});
console.debug(DATA); //gives me the expected result
};
}])
.controller("CTRL", ["$scope", "DATA", function ($scope, DATA) {
$scope.data = DATA;//wont update
}]);
因此,据我了解 angular 我认为它必须以这种方式工作,但我的数据数组仍然是空的。我在这里错过了什么?
问题是,当你分配DATA = angular.fromJson(msg.data).slice();
时,它根本不会影响$scope.data = DATA;
,因为$scope.data
和服务中的新DATA
数组没有连接,他们指向不同的对象。我们说它们之间没有引用。所以它也不会在视图中更新。
如果您只是更改对象的 属性 而不是完全覆盖对象引用,则修复起来非常容易:
angular.module("test", [])
.value("DATA", {values: []})
.service("WSS", ["$rootScope", "DATA", function ($rootScope, DATA) {
//initialise websocket here
m_WebSocket.onmessage = function (msg) {
$rootScope.$apply(function () {
DATA.values = angular.fromJson(msg.data).slice();
});
};
}])
.controller("CTRL", ["$scope", "DATA", function ($scope, DATA) {
$scope.data = DATA;
}]);
然后在模板中,您将使用 data.values
而不是像以前那样只使用 data
。
在这种情况下,$scope.data
是一个具有 属性 values
的对象。当新消息来自服务器时,唯一改变的是 DATA
对象的 属性 values
。但是在控制器中 $scope.data
指向 相同的 对象,因此 Angular 将能够获取选定的新数据。