当范围更改时,AngularJS不更新模板变量

时间:2014-01-06 16:23:31

标签: javascript angularjs angularjs-scope angularjs-service

这将是专家们非常明显的愚蠢问题之一。

我有一个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也会受到影响。

我错过了什么?

1 个答案:

答案 0 :(得分:21)

您可能需要使用$apply()

  

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

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