В html я повторяюсь над массивом строк:
<div class="palette__record"
data-ng-repeat="n in palette track by $index"
data-ng-style="{'background-color':'#'+n}">
</div>
В контроллере palette
собирается из localForage (аналогично localalstorage, но асинхронно)
$localForage.getItem('palette')
.then(colors => {
if(colors) vm.palette = colors;
});
Thisработает нормально, теперь после нажатия кнопки я "очищаю" палитру, устанавливая ее в []
в localForage, затем получая ее снова и устанавливая значение в контроллере:
vm.clearEntirePalette = () => {
$localForage.setItem('palette', [])
.then(() => {
$localForage.getItem('palette')
.then(colors => {
console.log('clear palette', colors);
if(colors) {
vm.palette = colors;
} else {
vm.palette = [];
}
});
});
};
Здесь, как вы можете видеть, язапись в консоль для двойной проверки, и это нормально, это пустой массив.Теперь, так как я всегда хочу, чтобы мой массив содержал 8 элементов (также, когда другие операции над этим массивом), у меня есть $ watch, который вызывается после vm.palette = colors;
сверху.
vm.$watch('palette', newVal => {
console.log('caught change');
if(newVal.length < 8) {
const fillArr = new Array(8 - newVal.length);
fillArr.fill('');
vm.palette = vm.palette.concat(fillArr);
console.log('after fill', vm.palette)
//$scope.$apply();
}
}, true);
Thisтакже работает нормально, после палитры кода выше массив с 8 пустыми строками.Однако ng-repeat
не улавливает это изменение и не обновляет.Я попытался использовать $scope.$apply()
в $watch
после заполнения, но это вызвало ошибку
[$ rootScope: inprog] $ digest уже выполняется
Как это исправитьтак нг-повтор отражать массив?