Javascript AngularJS:深度对象修改后视图未更新
我有以下html代码:Javascript AngularJS:深度对象修改后视图未更新,javascript,angularjs,Javascript,Angularjs,我有以下html代码: <table class="table table-striped table-condensed table-hover"> <tbody> <tr ng-repeat="doc in container.Documents "> {{doc.Status.Message}} </td> <!-- .... --&
<table class="table table-striped table-condensed table-hover">
<tbody>
<tr ng-repeat="doc in container.Documents ">
{{doc.Status.Message}}
</td>
<!-- .... -->
</tr>
</tbody>
</table
MYContainer的加载功能:
function load(id) {
var scope = this;
var deffered = $q.defer();
containerService.getData(id, "true").success(function (data) {
angular.extend(this, data);
deffered.resolve();
}).error(function (e) {
deffered.reject('Error while loading container');
});
return deffered.promise;
}
问题是,每当我重新加载批处理(使用修改过的container.Documents)时,它都不会在html视图中显示修改过的批处理
我读过angular中的equality watches,所以我在控制器中添加了watch函数,它确实检测到watch函数中的修改,所以我调用$scope.$apply(),但在html中它没有更改
如果我在$timeout调用中放置200毫秒而不是0,视图将发生更改。在$watch中调用$timeout(0)或$apply是毫无意义的,因为$watch本身由摘要调用,而调用$apply的点将触发摘要
相反,您希望在异步更改数据时强制执行此摘要—在本例中,在解析加载承诺时。在$watch内调用$timeout(0)或$apply是毫无意义的,因为$watch本身由摘要调用—调用$apply的点将触发摘要
相反,当数据异步更改时,您希望强制执行此摘要—在这种情况下,当负载承诺得到解决时。您不需要使用任何监视程序或
$apply
在这里,angular能够处理此问题,并在数据更改时更新视图。此外,$watchers在性能方面是昂贵的,而$scope.$apply是建议避免的,除非绝对必要,这里没有
$angular.extend
不是深度副本。你可以读到它
我建议您将代码更改为:
load($stateParams.Id).then(function(result) {
$scope.container = result;
});
删除angular.extend(这个,数据)从success
回调中选择code>
另外,删除整个$watch
部分,这是多余的。您不需要使用任何监视程序或$apply
,angular能够处理此问题,并在数据更改时更新视图。此外,$watchers在性能方面是昂贵的,而$scope.$apply是建议避免的,除非绝对必要,这里没有
$angular.extend
不是深度副本。你可以读到它
我建议您将代码更改为:
load($stateParams.Id).then(function(result) {
$scope.container = result;
});
删除angular.extend(这个,数据)从success
回调中选择code>
还要删除整个$watch
部分,它是冗余的。加载函数不在控制器中,它在MYContainer对象中,因此我可以调用(new MYContainer()).load(id);在我的controller@A.K没关系,随你怎么叫都行。剩下的才是最重要的。我用angular.copy()代替angular.extend(),它完成了任务。加载函数不在控制器中,它在MYContainer对象中,因此我可以调用(new MYContainer())。加载(id);在我的controller@A.K没关系,随你怎么叫都行。剩下的才是关键。我用angular.copy()代替angular.extend(),它完成了任务。