ng-repeat не подвержен очистке массива - PullRequest
0 голосов
/ 19 сентября 2019

В 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 уже выполняется

Как это исправитьтак нг-повтор отражать массив?

...