我的应用程序的其他区域几乎完全相同的代码片段,它的工作完全正常。
我正在将一个对象推入一个空数组,并在我看来有一个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函数运行正常,但模型没有更新视图。
答案 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拿起变化?