Регистрация  |  Вход

Передача списка ViewModel из контроллера в Lightning Component

Немного предыстории. Ищу работу - скинули вакансию, типа порешай тестовое задание и если что, то мы на связи.
Про этот вот Silesforce услышал я от них же, раньше - глухо.
Порылся в куче англиканского я текста, назаработал в плечи штук 15 я значков.
Система говорит - ты классный парень, и до тебя тут не было таких спецов.
Сажуся я за тестово задание. Все просто, контроллер, CRUD, и вьюха с пагинацией.
Уж думал я, что щас пиздец как отчитаюсь, медаль повешу и поеду новый бизнес покорять.
Но тестово задание оказалося с подвохом. Подвох тот - Lightning.
У меня вообще сложилось впечатление, что Lightning этот из говна и палок собран, на костыли поставлен, и сука костылями машет.
И там где в .Net я сделал бы за час, я тут сижу и целый день ругаюсь матом.

Смысл в чем. Так как с отладкой беда, нарисовал тестовый контроллер по поиску контактов

@AuraEnabled
public static List<ContactManagerListItemViewModel> getContacts(){

List<ContactManagerListItemViewModel> tempList = new List<ContactManagerListItemViewModel>();

List<Contact> tempContacts = Database.query('SELECT Id, Name, EMail, Contact_Level__c, Contact.Account.Name, Contact.Owner.Name, Contact.CreatedBy.Name, CreatedDate FROM Contact');

for(Contact cont: tempContacts){
ContactManagerListItemViewModel model = new ContactManagerListItemViewModel();
model.Id = cont.Id;
model.AccountName = cont.Account.Name;
model.ContactLevel = cont.Contact_Level__c;
model.CreatedBy = cont.CreatedBy.Name;
//model.CreatedDate = cont.CreatedDate;
model.Email = cont.Email;
model.Name = cont.Name;
model.OwnerName = cont.Owner.Name;
tempList.add(model);

}

return tempList;
}

В списке ViewModel, которую я нарисовал отдельным классом. Мне так захотелось, мне так надо.
Передавал перед этим результат SOQL - все данные приходят в компонент, но если передать таким вот макаром - данных нету. Вернее по логам вижу, что браузер принял массив из нужных мне позиций, но там все пусто.
Отправлял результат метода в виде JSON - строка приходит как надо, данные там есть.

И тут вот получается, что lightning:datatable мой результат запроса SOQL сожрал и все поля (lookup) оставил пустыми. Чего я во viewmodel и полез. Но список классов, которые не sObject он вообще игнорирует.

И у меня остается два путя.
1. Имея результат запроса SOQL самому рисовать таблицы. Блять, Lightning, ты серьезно?
2. Где-то в компоненте lightning:datatable есть возможность прописать поля (lookup). Порылся в этих ваших интернетах и не нашел как. Букварь говорит, что тип полей стандартный примитив и точка.

Памажитя а? А то у меня уже желание кинуть это все и дальше на net практиковаться

Немного предыстории. Ищу работу - скинули вакансию, типа порешай тестовое задание и если что, то мы на связи.
Про этот вот Silesforce услышал я от них же, раньше - глухо.
Порылся в куче англиканского я текста, назаработал в плечи штук 15 я значков.
Система говорит - ты классный парень, и до тебя тут не было таких спецов.
Сажуся я за тестово задание. Все просто, контроллер, CRUD, и вьюха с пагинацией.
Уж думал я, что щас пиздец как отчитаюсь, медаль повешу и поеду новый бизнес покорять.
Но тестово задание оказалося с подвохом. Подвох тот - Lightning.
У меня вообще сложилось впечатление, что Lightning этот из говна и палок собран, на костыли поставлен, и сука костылями машет.
И там где в .Net я сделал бы за час, я тут сижу и целый день ругаюсь матом.

Смысл в чем. Так как с отладкой беда, нарисовал тестовый контроллер по поиску контактов

[code]
@AuraEnabled
    public static List<ContactManagerListItemViewModel> getContacts(){
        
        List<ContactManagerListItemViewModel> tempList = new List<ContactManagerListItemViewModel>();
        
        List<Contact> tempContacts = Database.query('SELECT Id, Name, EMail, Contact_Level__c, Contact.Account.Name, Contact.Owner.Name, Contact.CreatedBy.Name, CreatedDate FROM Contact');
        
        for(Contact cont: tempContacts){
            ContactManagerListItemViewModel model = new ContactManagerListItemViewModel();
            model.Id = cont.Id;
            model.AccountName = cont.Account.Name;
            model.ContactLevel = cont.Contact_Level__c;
            model.CreatedBy = cont.CreatedBy.Name;
            //model.CreatedDate = cont.CreatedDate;
            model.Email = cont.Email;
            model.Name = cont.Name;
            model.OwnerName = cont.Owner.Name;
            tempList.add(model);
            
        }
        
        return tempList;
    }
[/code]

В списке ViewModel, которую я нарисовал отдельным классом. Мне так захотелось, мне так надо.
Передавал перед этим результат SOQL - все данные приходят в компонент, но если передать таким вот макаром - данных нету. Вернее по логам вижу, что браузер принял массив из нужных мне позиций, но там все пусто.
Отправлял результат метода в виде JSON - строка приходит как надо, данные там есть.

И тут вот получается, что lightning:datatable мой результат запроса SOQL сожрал и все поля (lookup) оставил пустыми. Чего я во viewmodel и полез. Но список классов, которые не sObject он вообще игнорирует.

И у меня остается два путя.
1. Имея результат запроса SOQL самому рисовать таблицы. Блять, Lightning, ты серьезно?
2. Где-то в компоненте lightning:datatable есть возможность прописать поля (lookup). Порылся в этих ваших интернетах и не нашел как. Букварь говорит, что тип полей стандартный примитив и точка.

Памажитя а? А то у меня уже желание кинуть это все и дальше на net практиковаться

Согласно доке

https://developer.salesforce.com/docs/component-library/bundle/lightning:datatable/documentation

lightning:datatable должен переваривать массив с любым содержимым. Как SObject так и простых объектов.

Только я так понимаю для обычных объектов надо описать columns. Попробуй просто сделать на JS сначала массив объектов и передать его lightning:datatable, а также вывести в консоль то что приходит из SF.

Согласно доке

https://developer.salesforce.com/docs/component-library/bundle/lightning:datatable/documentation

lightning:datatable должен переваривать массив с любым содержимым. Как SObject так и простых объектов.

Только я так понимаю для обычных объектов надо описать columns. Попробуй просто сделать на JS сначала массив объектов и передать его lightning:datatable, а также вывести в консоль то что приходит из SF.

Не столбцы прописаны. Там все нормально. Из SF приходит пустора.

Вот что в логе. Это то что приходит:
ContactTableComponent.js:29 Array(19)0: {}1: {}2: {}3: {}4: {}5: {}6: {}7: {}8: {}9: {}10: {}11: {}12: {}13: {}14: {}15: {}16: {}17: {}18: {}length: 19__proto__: Array(0)

Может во viewmodel косяк, но какбы сделано все по феншую и канонам:

public class ContactManagerListItemViewModel {
public Id Id {get; set;}
public String Name {get; set;}
public String AccountName {get; set;}
public String OwnerName {get; set;}
public String Email {get; set;}
public String ContactLevel {get; set;}
public String CreatedBy {get; set;}
//public Datetime CreatedDate {get; set;}
}

Не столбцы прописаны. Там все нормально. Из SF приходит пустора.

Вот что в логе. Это то что приходит:
ContactTableComponent.js:29 Array(19)0: {}1: {}2: {}3: {}4: {}5: {}6: {}7: {}8: {}9: {}10: {}11: {}12: {}13: {}14: {}15: {}16: {}17: {}18: {}length: 19__proto__: Array(0)

Может во viewmodel косяк, но какбы сделано все по феншую и канонам:
[code]
public class ContactManagerListItemViewModel {
    public Id Id {get; set;}
    public String Name {get; set;}
    public String AccountName {get; set;}
    public String OwnerName {get; set;}
    public String Email {get; set;}
    public String ContactLevel {get; set;}
    public String CreatedBy {get; set;}
    //public Datetime CreatedDate {get; set;}
}
[/code]

yurick
Array(19)0: {}1: {}2: {}3: {}4: {}5: {}6: {}7: {}8: {}9: {}10: {}11: {}12: {}13: {}14: {}15: {}16: {}17: {}18:

Ну да, массив с пустыми объектами. Я тут уже не подскажу. По ходу Aura не сериализирует массив.
Я тут уже не подскажу, но как вариант проверить обходной вариант.

public static List<ContactManagerListItemViewModel> getContacts()
заменить на
public static String getContacts()

return tempList;
заменить на
return JSON.serialize(tempList);

На фронтенде проверить что в стринге приходит (вывести в консоль). Десериализировать обратно в массив (JSON.parse(...)) и скормить lightning:datatable

[quote="yurick"]Array(19)0: {}1: {}2: {}3: {}4: {}5: {}6: {}7: {}8: {}9: {}10: {}11: {}12: {}13: {}14: {}15: {}16: {}17: {}18: [/quote]
Ну да, массив с пустыми объектами. Я тут уже не подскажу. По ходу Aura не сериализирует массив.
Я тут уже не подскажу, но как вариант проверить обходной вариант.

public static List<ContactManagerListItemViewModel> getContacts()
заменить на
public static String getContacts()

return tempList;
заменить на 
return JSON.serialize(tempList);

На фронтенде проверить что в стринге приходит (вывести в консоль). Десериализировать обратно в массив (JSON.parse(...)) и скормить lightning:datatable 


yurick
И там где в .Net я сделал бы за час, я тут сижу и целый день ругаюсь матом.

Это нормально для любого языка. Такая же картина у меня была с .net. После много летнего опыта на python и SF попросили сделать небольшой проектик на .net. Сделал конечно, но больше не соглашусь это точно! Разные платформы, разные подходы.

[quote="yurick"]И там где в .Net я сделал бы за час, я тут сижу и целый день ругаюсь матом.[/quote]
Это нормально для любого языка. Такая же картина у меня была с .net. После много летнего опыта на python и SF попросили сделать небольшой проектик на .net. Сделал конечно, но больше не соглашусь это точно! Разные платформы, разные подходы. 

Через JSON посылал. Там данные есть. А значит - нахер вот эти костыли?

Через JSON посылал. Там данные есть. А значит - нахер вот эти костыли?

если я правиьлно понял вопрос
на каждом проперти твоего view model добавь @AuraEnabled
это как в дотнете фишечка для JSON сериалайза - что бы не все проперти сериализовались, только тут по умолчанию для ауры ничего не вернется в респонсе, если не помечен проперти как @auraenabled

если я правиьлно понял вопрос
на каждом проперти твоего view model добавь @AuraEnabled
это как в дотнете фишечка для JSON сериалайза - что бы не все проперти сериализовались, только тут по умолчанию для ауры ничего не вернется в респонсе, если не помечен проперти как @auraenabled

А-а-а-а, не баг, а фича.
Отдам тебе я персонально - вялiкi дзякуй.

А-а-а-а, не баг, а фича.
Отдам тебе я персонально - вялiкi дзякуй.