Javascript 如何让AngularJS更新ng repeat数组拼接上的DOM$scope.$apply()返回一个错误
已解决-我有这一点,它表明了我所面临的问题。这是一个简单的图像上传程序,它还使用Javascript 如何让AngularJS更新ng repeat数组拼接上的DOM$scope.$apply()返回一个错误,javascript,angularjs,dom,angularjs-ng-repeat,Javascript,Angularjs,Dom,Angularjs Ng Repeat,已解决-我有这一点,它表明了我所面临的问题。这是一个简单的图像上传程序,它还使用FileReader显示图像(感谢)。我把它放在一个动态的形式,可以添加和删除 问题: 在这种情况下,dataUrl在Add之后才会显示 单击另一个图像。这可能是唯一的问题,因为 图像在我的网站上显示得很好--解决 如果将图像上载到第一个表单上,然后单击添加另一个图像,然后单击第一个选项卡,然后删除第一个选项卡,则会在$scope.images中删除数据,但不会更新DOM。添加$scope.$apply()会导致摘要
FileReader
显示图像(感谢)。我把它放在一个动态的形式,可以添加和删除
问题:
dataUrl
在Add之后才会显示
单击另一个图像
。这可能是唯一的问题,因为
图像在我的网站上显示得很好--解决添加另一个图像
,然后单击第一个选项卡,然后删除第一个选项卡,则会在$scope.images
中删除数据,但不会更新DOM。添加$scope.$apply()
会导致摘要已在进行中的错误Update2:我已尝试为
附加一个$scope.$apply
,因为您的指令在AngularJs中处理摘要周期之外的事件,所以您需要在scope.$apply()
中包装对作用域的任何更新。因此,在你的指令中:
reader.onload = function() {
var dataURL = reader.result;
scope.$apply(function() {
scope.$parent.upload(file, dataURL, attributes.angularFileUploads);
});
};
似乎image.dataUrl被缓存了或其他什么东西
添加
ng if=“image.dataUrl”
到
标记
似乎可以补救这种情况,但并不能解决根本问题。。不管它是什么。您对ngRepeat中的表达式跟踪有问题
正如医生所说的
ngRepeat对DOM进行相应的更改:
- 添加项时,模板的新实例将添加到DOM中
- 删除项时,其模板实例将从DOM中删除
- 当项目被重新排序时,它们各自的模板在DOM中被重新排序
所以,在您拼接第一个元素的情况下,最后一个元素的索引将更改为第一个,您只需要从DOM中删除最后一个元素,而不需要先更改
另外,$index、$last和etc是ngRepeat作用域中的一个特殊属性,因此它始终可用,并且不依赖于track by expresion而不是$scope.$apply
,尝试注入$timeout
并执行$timeout(函数(){/*stuff with$scope*/})代码>@StickyCube,我以前试过,但没有改变任何东西。我为$timeout(function(){$scope.images.splice($scope.images.indexOf($scope.image),1);},100)添加了$timeout
为什么在ng repeat中使用track by$index
?我使用track by$index
以便angular file uploads=“{{$index}}”
知道上载了哪个图像编号。我试着按$index删除曲目
,结果似乎。。。。。。。工作此外,似乎$index无论如何都能起作用。我想这就解决了@格伦迪,我希望你能添加你的解释作为答案。$index
是ngRepeat中的一个特殊变量,它始终可用,nod取决于你如何跟踪问题,正如格伦迪所暗示的,跟踪$index
。移除使其按预期工作的。