Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS视图在模型更改时不更新_Angularjs - Fatal编程技术网

AngularJS视图在模型更改时不更新

AngularJS视图在模型更改时不更新,angularjs,Angularjs,我有一个$rootScope变量,如下所示: $rootScope.queue = {'A1':{'Name':'John','ID':'A1'},'A2':{'Name':'Anna','ID':'A2'}}; 在我的控制器中,我有一个类似这样的函数,其中更新是队列中包含最新数据的对象: $scope.onMessage = function(update) { angular.extend($rootScope.queue[update['ID']], update); }; 最

我有一个$rootScope变量,如下所示:

$rootScope.queue = {'A1':{'Name':'John','ID':'A1'},'A2':{'Name':'Anna','ID':'A2'}};
在我的控制器中,我有一个类似这样的函数,其中更新是队列中包含最新数据的对象:

$scope.onMessage = function(update) {
    angular.extend($rootScope.queue[update['ID']], update);
};
最近的数据来自外部应用程序,该应用程序使用Google Channel API将数据发送到我的应用程序。以下是同一控制器中的代码:

channel = new goog.appengine.Channel('<?php echo $token ?>');
socket = channel.open();
socket.onmessage = $scope.onMessage;
$rootScope.queue已正确更新,但除非重新单击此人,否则我的视图不会更新

对于我的视图,我有一些类似于setActive的东西,它将一个名为active的$scope变量设置为ID:

<div ng-controller="queueController">
    <div name="people" ng-model="people">
        <div ng-repeat="people in queue" ng-click="setActive(people.ID)">{{ people.Name }}</div>
    </div>
    <div ng-model="queue">You clicked {{ queue[active].Name }}</div>
</div>

我的理解是,在AngularJS中,如果队列中的数据发生变化,我的视图也会更新。我遗漏了什么?

我认为问题在于使用ng model=queue创建了$scope.queue,而不是使用$rootScope.queue

为了解决这个问题,我可以这样定义队列:

$rootScope.myapp.queue = {'A1':{'Name':'John','ID':'A1'},'A2':{'Name':'Anna','ID':'A2'}};

然后使用ng model=myapp.queue

是否尝试运行rootscope.$apply@Beri何时何地运行此功能?@Craig在onMessage中,在您修改AngularJS后面的范围后。阅读它的文档:@JBNizet谢谢你的帮助。我如何修改AngularJS后面的范围?该代码位于控制器功能中。是因为我在使用angular.extend吗?如果是这样的话,我该如何做才能让AngularJS自动获取更改?您在事件发生后修改对象,而AngularJS没有意识到谷歌频道消息不是由AngularJS处理的。因此Angular无法知道对象已被修改,因此不会重新计算视图中使用的所有表达式。所有这些都在文档中进行了解释。
$rootScope.myapp.queue = {'A1':{'Name':'John','ID':'A1'},'A2':{'Name':'Anna','ID':'A2'}};