Javascript AngularJS:深度对象修改后视图未更新

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> <!-- .... --&

我有以下html代码:

<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(),它完成了任务。