带有Angular ng-repeat的JavaScript array.push(object)无法按预期运行

时间:2015-02-04 18:44:31

标签: javascript angularjs

我的应用程序的其他区域几乎完全相同的代码片段,它的工作完全正常。

我正在将一个对象推入一个空数组,并在我看来有一个ng-repeat。

JavaScript的:

$scope.upload = $upload.upload({
    url: BASE + 'files/tasks',
    file: file,
    data: data
}).success(function(data) {
    for(var i = 0; i < $scope.case.task.notes.length; i++) {
        if($scope.case.task.notes[i].in_api === false) {
            $scope.case.task.notes[i].documents.push(data);
        }
    }
});

在我向数组添加JSON响应后console.log $scope.case.task.notes时,我看到了预期的结果(注释对象和documents数组,返回的对象在文件数组)。

在我看来,该页面下面的HTML增加了Angular模板:

<div>
    <p class="chat-file row" ng-repeat="document in note.documents track by $index">
        <b class="pull-left col-sm-6">
            <i class="fa fa-file"></i> {{document.name}} 
        </b>
        <span class="col-sm-6 pull-right"> 
            <a href="http:/download.com?f={{document.id}}&n={{document.name}}" class="btn btn-xs btn-success">download</a> 
        </span>
    </p>
</div>

首次加载页面时,所有有文档的笔记都会正确显示。但是,当从上面的upload函数调用成功函数,并且文档被推到笔记的数组上时,它不会出现在视图中。

如果它有所不同,上面的HTML也包含在ng-repeat内部,它遍历每个音符(因此它是多级的)。

可能是什么问题? JavaScript函数运行正常,但模型没有更新视图。

2 个答案:

答案 0 :(得分:4)

尝试使用$ scope。$ apply()告诉您的视图范围数据已更改:

 .success(function(data) {
     // Do what you want.
     $scope.$apply();
 });
  

$ apply()用于从角度框架外部以角度执行表达式。 (例如,来自浏览器DOM事件,setTimeout,XHR或第三方库)。因为我们正在调用角度框架,所以我们需要执行异常处理的适当范围生命周期,执行监视。

答案 1 :(得分:0)

您似乎使用了不同的变量。在HTML中,您使用note.documents

ng-repeat="document in note.documents ...

在JavaScript中,您使用$scope.case.task.notes[i].documents

您需要让它们引用相同的数组。也许如果你设置

$scope.documents = $scope.case.task.notes[i].documents;
在您的JavaScript中

并将HTML更改为

ng-repeat="document in documents ..."

然后Angular拿起变化?