这将是专家们非常明显的愚蠢问题之一。
我有一个websocket将数据推送到服务,我正在尝试存储数据并通过我的控制器将其推送到模板。
数据进入并更新变量,但仅更新UI是我对该数据执行操作:
services.factory('Summary', ['$q','$rootScope','$http', '$location', function ($q, $rootScope,$http, $location) {
var Service = {};
Service.dataObj = {};
Service.dataObj.d = {"gello":"goodbye"};
....
function listener(data) {
messageObj = data;
Service.dataObj.d = data;
console.log("Received data from websocket: ", messageObj);
}
})]);
controllers.controller('UserCtrl', ['$scope', 'Summary',
function ($scope, Summary) {
$scope.click = function(){
alert(JSON.stringify($scope.summaryinfo));
}
$scope.summaryinfo = [Summary.dataObj];
$scope.summarygridOptions = {
data: 'summaryinfo'
};
console.log("hello");
}]);
数据被输入并据我所知,因为它存储在Service.dataObj.d中,如果我在Service.dataObj指向我的HTML模板,那个对象正在被更新而不是被替换,所以指针应该保留并且对象被观看。
但是除非我运行click()方法,否则它不会改变,在这种情况下,即使我只是触发警报,UI也会受到影响。
我错过了什么?
答案 0 :(得分:21)
您可能需要使用$apply()
:
$ apply()用于从角度框架外部以角度执行表达式。 (例如,来自浏览器DOM事件,setTimeout,XHR或第三方库)。
function listener(data) {
$scope.$apply(function() {
Service.dataObj.d = data;
});
}