Здравствуйте! Есть такая проблема:
Вступление. Есть некоторая таблица, в которую можно добавить записи. Напротив каждой добавленной записи есть кнопка Delete(самописная, с отлавливанием Id записи и последующим удалением).
Проблема: После нажатия кнопки Delete запись удаляется, но таблица не отображает изменения, т.е если заново перейти на страницу приложения, то все отображается корректно. Если не переходить, таблица не реагирует на нажатие. rerender есть.
Теже грабли с кнопкой quick save, но она объявляется как компонент стандартного контроллера. Опять таки, всё работает и отображается корректно в случае обновления страницы. На лету - нет.
Заранее извиняюсь за такие вопросы, человек я в salesforce новый, но всё же, хотелось бы разобраться. С большей частью приложения, благодаря этому прекрасному форуму и воркбуках, справился.
У меня было что-то похожее, может быть твой случай:
Если хочешь чтобы "ререндернулся" какой-то видимый элемент (таблица, блок), то надо выбирать для rerender ID блока на уровень выше.
Например если есть таблица, то надо обернуть ее в
<apex:outputPanel layout="block" id="rerender_me">...</apex:outputPanel>
и обновить именно этот блок.
О, и еще вспомнил по ходу:
смотри - таблица у тебя строится по какому-то листу, который ты заполняешь в конструкторе. При вызове метода для удаления, удаляется элемент из базу, но в листе он остается и если ты после удаления заново не перестроишь лист или не удалишь вручную из листа, то таблица у тебя так же и построится, с теми же элементами. И конечно после перезагрузки лист опять построится из базы уже по актуальным данным.
Что-то ты совсем какой-то бред написал.
когда я говорил про table - я имел в виду тег на Visualforce странице который ты пытаешься обновить (сделать "rerender")
когда я говорил про List - это уже про apex class (controller) это список того что ты хочешь вывести на странице.
Как ты это все уместил в List<table> вообще не понял?
Попробуй пройтись (еще раз если уже проходился) по workbook.
Не обижайся, но с основными понятиями у тебя пока сложности.
Не то, чтобы бред, но мысли выразил непонятным образом
Суть сводится к тому, что я пока(!) не знаю, как "после удаления заново не перестроишь лист или не удалишь вручную из листа". Напрашивается только варварский метод после удаления рефреш страницы сделать:D
Да чего обижаться, я меньше недели в данном направлении)
p.s quicksave теперь работает как надо
Переделал метод Delete - работает как надо:)
Однако возник вопрос с тестами:
public static testMethod void deletetest() {
List<Product__c> products = new List<Product__c>();
ApexPages.StandardController sc = new ApexPages.StandardController(products);
ProductsController cont = new ProductsController(sc);
Product__c p = new Product__c(Name = 'll', Type__c = 'll', Price__c = 10.00);
insert p;
products.add(p);
string selectRecordId = p.Id;
integer i=0;
cont.products = products;
cont.DeleteRecord();
}Error: Compile Error: Constructor not defined: [ApexPages.StandardController].<Constructor>(LIST<Product__c>) at line 15 column 43
Решил проблему таким образом:
public static testMethod void deletetest() {
List<Product__c> products = new List<Product__c>{};
Product__c p = new Product__c(Name = 'll', Type__c = 'desll', Price__c = 10.00);
test.startTest();
insert p;
ApexPages.StandardController sc = new ApexPages.StandardController(p);
ProductsController controller = new ProductsController(sc);
products.add(p);
string selectRecordId = p.Id;
integer i=0;
controller.DeleteRecord();
test.stopTest();
}Дошло. в тесте она не используется.В куске все нормально.
И как же у тебя в DeleteRecord() из контроллера может использоваться selectRecordId, который ты объявляешь в тестах? Это разные области видимости. Я не вижу чтобы ты передавал selectRecordId в controller чтобы потом DeleteRecord() из него взял твою переменную.