2014-01-06 170 views
15

这将是专家们非常明显的那些愚蠢问题之一。AngularJS在范围变化时不更新模板变量

我有一个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中,如果我将我的HTML模板指向Service.dataObj,那么该对象正在更新并且未被替换,因此指针应该保留并且该对象将被监视。

但它不会改变,除非我运行click()方法,在这种情况下,即使我只是触发警报,UI也会受到影响。

我错过了什么?

+0

尝试使用范围$ apply以应用更改。 – Daiwei

+0

昨晚花了4个小时试图弄清楚到底发生了什么......今天早上醒来看到了你的问题,并在3分钟内修好了!感谢bugg_tb! – rastko

回答

21

您可能需要使用$apply()

$适用()用来从角框架之外的角度来执行的表达式。 (例如,来自浏览器DOM事件,setTimeout,XHR或第三方库)。

function listener(data) { 
    $scope.$apply(function() { 
     Service.dataObj.d = data; 
    }); 
} 
+0

谢谢你们,知道这很明显。我在一个不同的项目中有类似的调用,但显然初始化必须不同,因为我不依赖$ apply。和以往一样新东西:) –