Javascript 当“按值跟踪”更改时,如何重新生成ng repeat?
我有以下ng重复表达式:Javascript 当“按值跟踪”更改时,如何重新生成ng repeat?,javascript,angularjs,angularjs-ng-repeat,Javascript,Angularjs,Angularjs Ng Repeat,我有以下ng重复表达式: ng-repeat="album in albums track by (album.id + gallery.layout)" 正如您所看到的,曲目来源取决于专辑的id和库布局。当我更改库布局时,什么也没发生-看起来ng repeat不希望按值更改轨迹。要修复它,我必须添加/删除相册,因为布局已更改,所有项目都已更新 如何强制angular更新ng repeat?我可以选择上一张相册,删除它,然后用$timeout添加,但我不喜欢这个解决方案。如果对象确实因库而异,
ng-repeat="album in albums track by (album.id + gallery.layout)"
正如您所看到的,曲目来源取决于专辑的id和库布局。当我更改库布局时,什么也没发生-看起来ng repeat不希望按值更改轨迹。要修复它,我必须添加/删除相册,因为布局已更改,所有项目都已更新
如何强制angular更新ng repeat?我可以选择上一张相册,删除它,然后用$timeout添加,但我不喜欢这个解决方案。如果对象确实因库而异,一个选项是为它设置单独的属性。因此,您的JS可能看起来像:
$scope.$watch('gallery.layout', injectGalleryLayoutIds);
function injectGalleryLayoutIds(galleryLayout){
$scope.albums.forEach(function(album){
album.idForGallery = album.id + galleryLayout;
});
}
相反,你可以通过idForGallery追踪
如果要避免修改相册对象,可以使用包装器。当然,这将为每个相册使用一些额外的内存:
$scope.$watch('gallery.layout', updateGalleryAlbums);
function updateGalleryAlbums(galleryLayout){
$scope.galleryAlbums = $scope.albums.map(function(album){
return { album: album, id: album.id + galleryLayout };
});
}
然而,我的印象是,您试图解决的问题可能通过以下两种方式得到更好的解决:
1纯CSS。将不同的类添加到具有布局名称的父元素中,并根据需要尽可能详细地绘制项目。显示/隐藏项目,并通过CSS重新设置样式
如果版面结构差异太大,纯CSS方法不可行,另一种选择可能是:
2具有不同库布局的指令或视图,ng在它们之间切换或类似地注入布局,ng在HTML中重复,只需按相册进行跟踪。id手动调用$digest可能会有所帮助不,这不是$digest问题