Как определить, является ли массив строковых объектов пустым, используя ngIf? - PullRequest
0 голосов
/ 31 мая 2019

Мне нужно написать код, в котором я должен перенести некоторые элементы между двумя списками и скрыть ошибку, когда массив литералов объекта, который должен быть передан, не пуст.Я создал два контроллера (для управления двумя отдельными списками) и один сервис для работы с общими данными.Список был определен внутри службы вместе с некоторыми функциями для передачи элементов из одного списка в другой.Казалось, что размер массива никогда не менялся с 0, это логика, которую я пытаюсь использовать в ngIf.

Моя логика заключалась в том, чтобы проверить, является ли массив пустым, а затем вернуть значение true, если он был пустым, иустановите переменную пустой в контроллере.Тогда в ng-if я проверю ng-if = "b.empty" и подумал, что это будет работать, но это не так.Размер массива будет оставаться 0 на протяжении всего жизненного цикла моего кода.Я использовал ._isEmpty (list), angular ([], []) и наиболее очевидный, array.length, но проблема заключалась в том, что изначально они показывали 0, но затем размер массива никогда не менялся.Даже после заполнения целевого массива размер, по-видимому, оставался равным 0 для любой / всех вышеперечисленных функций / методов.

l1.$inject = ['listService']
function l1(listService){
    var buying = this;
    buying.items = listService.display();
    buying.Add = function ($index){
        listService.addItem($index);
    }
};    //This is the controller for the source array.
.
.
.
bought.empty = listService.checkIfFull();   //Part of the second controller which assigns empty a boolean value
.
.
.
service.checkIfFull = function (){
    if(blist.length == 0){
        console.log(_.isEmpty(blist))
        console.log(tblist)
        return false;
    }
    else
    {
        console.log("not going here");
        return true;
    }
};    //The service checks if the array is empty
<div class="emptyMessage" ng-if="b.empty">Nothing bought</div> 

Значение операторов console.log также, по-видимому, только выполняетсяв истинной части заявления if.Я нашел для этого решение, которое заключалось в простой проверке самого тега html, если длина локального списка (который я повторяю, по ng-repeat) была равна нулю, и это сработало.Но не могли бы вы объяснить, почему моя попытка неверна?Я новичок в AngularJs и JS в целом, поэтому, возможно, я не понял некоторые правила относительно js и, таким образом, написал неправильный код.Спасибо.

Редактировать: вот ссылка на кодовый блок-> https://codepen.io/meanmanmachineman/pen/RmmdjY

1 Ответ

0 голосов
/ 06 июня 2019

Ваша проблема вызвана строкой bought.empty = listService.checkIfFull();.Там вы вызываете функцию listService.checkIfFull() и присваиваете возвращаемое значение bought.empty.Что вы должны сделать, это присвоить самой функции bought.empty:

bought.empty = listService.checkIfFull;

Таким образом, каждый раз, когда bought.empty оценивается, он возвращает текущее реальное значение.

РЕДАКТИРОВАТЬ:

Я попытаюсь быть более точным о разнице между bought.empty = listService.checkIfFull() и bought.empty = listService.checkIfFull.

Первый способ, bought.empty вызовет listService.checkIfFull() и сохранит возвращаемое значениев качестве статического значения и при любой оценке переменной значение будет тем же.

При использовании другого метода значение bought.empty является не числом, а самой функцией listService.checkIfFull.Таким образом, каждый раз, когда AngularJS оценивает переменную, функция выполняется и возвращает соответствующее значение.

...