Немного предыстории. Ищу работу - скинули вакансию, типа порешай тестовое задание и если что, то мы на связи.
Про этот вот 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]
Ну да, массив с пустыми объектами. Я тут уже не подскажу. По ходу 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
Это нормально для любого языка. Такая же картина у меня была с .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 дзякуй.