TypeError: Cannot read property 'length' of undefined

84
10 сентября 2021, 13:00

помогите разобраться в следующем плс: на данный момент настроил пагинацию и сортировку, но для некоторыx условий, которые я задаю в ангуляре так же необходимо знать общее количество страниц. По порядку, на сегодняшний день все работает хорошо, однако мне не нравится сам код, решил его переписать и в одном моменте столкнулся с проблемой. Код работает сейчас так: Метод в контроллере который отправляет клиентов:

[HttpGet("[action]")]
        [HttpGet("[action]/{page}")]
        [HttpGet("[action]/{page}/{size}")]
        [HttpGet("[action]/{page}/{size}/{order}")]
        public IActionResult GetCustomers(int page = 1, int size = 3, string order="")
        {
            var customers=db.Customers.Include(x => x.CustomerProducts).ThenInclude(x => x.Product).AsQueryable();
            switch (order)
            {
                case "Name":
                    customers = customers.OrderBy(s => s.Name);
                    break;
                case "NameDesc":
                    customers = customers.OrderByDescending(s => s.Name);
                    break;
                case "Address":
                    customers = customers.OrderBy(s => s.Address);
                    break;
                case "AddressDesc":
                    customers = customers.OrderByDescending(s => s.Address);
                    break;
                case "PhoneNumber":
                    customers = customers.OrderBy(s => s.PhoneNumber);
                    break;
                case "PhoneNumberDesc":
                    customers = customers.OrderByDescending(s => s.PhoneNumber);
                    break;
            }
            List<CustomerViewModel> cusvm = customers
                .Skip((page - 1) * size)
                .Take(size)
                .ToList()
                .Select(c => new CustomerViewModel
            {
                Id = c.Id,
                Name = c.Name,
                Address = c.Address,
                PhoneNumber = c.PhoneNumber,
                Products = c.CustomerProducts.Select(x=>new ProductViewModel(x)).ToList()
            }).ToList();

            return Ok(cusvm);           
        }

метод датаСервиса:

getCustomers(page: number, size = 2, order:string) {
        return this.http.get(`api/customers/GetCustomers/${page}/${size}/${order}`);
    }

и запрос в компоненте:

customersList: Customer[];
TotalPage: number[]=[];//Общее количество страниц
    page: number = 1;//Первая страница
    size: number = 5;//Количество строк на странице
    order: string = '';
    reverse: boolean = false;

    constructor(private dataService: DataService) {}
    ngOnInit() {
        this.load();        
    }
    load() {
        this.dataService.getCustomers(this.page, this.size, this.order).subscribe((data: Customer[]) => this.customersList = data);             
    }

далее мне нужно общее количество страниц, я получаю их так: Метод контроллера

[HttpGet]
    public IActionResult GetCustomersTotalPage()
    {
        var count = db.Customers.Count();
        int size = 5;
        var res = Math.Ceiling(count / (double)size);
        List<int> TotalPage = new List<int>();
        for(var i =1; i <= res; i++)
        {
            TotalPage.Add(i);
        }
        return Ok(TotalPage);
    }

метод датаСервиса:

getCustomersTotalPage() {
        return this.http.get(this.url);
    }

Компонент:

load() {        
        this.dataService.getCustomersTotalPage().subscribe((data: number[]) => this.TotalPage = data);      
    }

в итоге компонент выглядит следующим образом:

@Component({
    templateUrl: './customer-list.component.html'
})
export class CustomerListComponent implements OnInit {

    customersList: Customer[];
    TotalPage: number[]=[];//Общее количество страниц
    page: number = 1;//Первая страница
    size: number = 5;//Количество строк на странице
    order: string = '';
    reverse: boolean = false;

    constructor(private dataService: DataService) {}
    ngOnInit() {
        this.load();        
    }
    load() {
        this.dataService.getCustomers(this.page, this.size, this.order).subscribe((data: Customer[]) => this.customersList = data); 
        this.dataService.getCustomersTotalPage().subscribe((data: number[]) => this.TotalPage = data);      
    }

Воот, т.к. в контроллере мне не нравится что я использую 2 гет метода, я решил все совместить в один, создал отдельно вью модель:

public class IndexViewModel
    {
        public IEnumerable<CustomerViewModel> Customers { get; set; }
        public List<int> TotalPage { get; set; }
    }

переписал метод контроллера:

public IActionResult GetCustomers(int page = 1, int size = 3, string order="")
        {
            var customers=db.Customers.Include(x => x.CustomerProducts).ThenInclude(x => x.Product).AsQueryable();
            switch (order)
            {
                case "Name":
                    customers = customers.OrderBy(s => s.Name);
                    break;
                case "NameDesc":
                    customers = customers.OrderByDescending(s => s.Name);
                    break;
                case "Address":
                    customers = customers.OrderBy(s => s.Address);
                    break;
                case "AddressDesc":
                    customers = customers.OrderByDescending(s => s.Address);
                    break;
                case "PhoneNumber":
                    customers = customers.OrderBy(s => s.PhoneNumber);
                    break;
                case "PhoneNumberDesc":
                    customers = customers.OrderByDescending(s => s.PhoneNumber);
                    break;
            }
            List<CustomerViewModel> cusvm = customers
                .Skip((page - 1) * size)
                .Take(size)
                .ToList()
                .Select(c => new CustomerViewModel
            {
                Id = c.Id,
                Name = c.Name,
                Address = c.Address,
                PhoneNumber = c.PhoneNumber,
                Products = c.CustomerProducts.Select(x=>new ProductViewModel(x)).ToList()
            }).ToList();
            var count = db.Customers.Count();
            var res = Math.Ceiling(count / (double)size);
            List<int> TotalPage = new List<int>();
            for (var i = 1; i <= res; i++)
            {
                TotalPage.Add(i);
            }
            IndexViewModel viewModel = new IndexViewModel
            {
                Customers = cusvm,
                TotalPage = TotalPage
            };
            return Ok(viewModel);           
        }

создал аналогичный вью модели класс в тс:

import { Customer } from "./customer";
export class IndexViewModel {
    constructor(
        public customers: Customer[]=[],
        public TotalPage: number[]=[], ) { }
}

и изменил компонент:

@Component({
    templateUrl: './customer-list.component.html'
})
export class CustomerListComponent implements OnInit {
    allcomp: IndexViewModel;
    customersList: Customer[];
    TotalPage: number[]=[];//Общее количество страниц
    page: number = 1;//Первая страница
    size: number = 5;//Количество строк на странице
    order: string = '';
    reverse: boolean = false;

    constructor(private dataService: DataService) {}
    ngOnInit() {
        this.load();        
    }
    load() {
        this.dataService.getCustomers(this.page, this.size, this.order).subscribe((data: IndexViewModel) => this.customersList = data.customers);
        this.dataService.getCustomers(this.page, this.size, this.order).subscribe((data: IndexViewModel) => this.TotalPage = data.TotalPage);               
    }

Что имею в итоге, все работает, клиенты передаются как положено, НО я не могу получить ТоталПейдж, что бы я не делал, список страниц не передается переменной ангуляра... если не сложно подскажите в чем моя ошибка? Пробовал делать:

this.dataService.getCustomers(this.page, this.size, this.order).subscribe((data: IndexViewModel) => this.allcomp= data);

и уже потом раздавать список клиентов и страниц, но тогда вообще не видит ничего(

READ ALSO
C# шаблон проверка типа T

C# шаблон проверка типа T

Есть такой Метод

108
Можно ли конвертировать дамп базы данных SQlite в MySQL?

Можно ли конвертировать дамп базы данных SQlite в MySQL?

Есть дамп базы SQlite, мне нужно получить скрипт для создания такой же базы данных с полями и тд, для MySqlДамп я сделал, заменил в нем AUTOINCREMENT на AUTO_INCREMENT

97
SQL select из четырех таблиц

SQL select из четырех таблиц

Не знаю какую конструкцию mysql использоватьУ меня есть четыре таблицы:

124
Ошибка MySql при поиске на сайте

Ошибка MySql при поиске на сайте

Перенесли сайт на новый VDS серверПытаемся воспользоваться поиском, переходит на страницу поиска и пишет DB query error

156