Привет!
Пока только познаю, но что может быть не так?
Нужно удалить запись в Salesforce.
Компонент итерируется в родительском компоненте.
Перезагружаю страницу, все равно при инициализации в родительском объекте загружается эта запись.
Компонент:
<aura:component controller="ExpensesController">
<aura:attribute name="expense" type="Expense__c"/><lightning:card title="{!v.expense.Name}" iconName="standard:scan_card"
class="{!v.expense.Reimbursed__c ?
'slds-theme--success' : 'slds-theme--default'}">
<p>
<lightning:button class="slds-button slds-align_absolute-center slds-button_destructive" label="Delete" onclick="{!c.deleteExpense}" />
</p>
</lightning:card>
</aura:component>
Контроллер:
deleteExpense: function (component) {
var action = component.get("c.deleteExpense");
var expId = component.get("v.expense.Id");
console.log('expId = ' + expId);
action.setParams({expenseId:expId})
// Add callback behavior for when response is received
action.setCallback(this, function(response) {
var state = response.getState();
if (state === "SUCCESS") {
// console.log(response.getReturnValue());
console.log("Success with state: " + state);
}
else {
console.log("Failed with state: " + state);
}
});
// Send action off to be executed
$A.enqueueAction(action);
},
Apex-controller:
@AuraEnabled
public static void deleteExpense(String expenseId) {
if (expenseId!=null) {
Expense__c exp = [select id from expense__c where id=:expenseId];
delete exp;
}
}
Привет! Пока только познаю, но что может быть не так? Нужно удалить запись в Salesforce. Компонент итерируется в родительском компоненте. Перезагружаю страницу, все равно при инициализации в родительском объекте загружается эта запись. [size=20][b]Компонент[/b]:[/size] [code] <aura:component controller="ExpensesController"> <aura:attribute name="expense" type="Expense__c"/> <lightning:card title="{!v.expense.Name}" iconName="standard:scan_card" class="{!v.expense.Reimbursed__c ? 'slds-theme--success' : 'slds-theme--default'}"> <p> <lightning:button class="slds-button slds-align_absolute-center slds-button_destructive" label="Delete" onclick="{!c.deleteExpense}" /> </p> </lightning:card> </aura:component>[/code] [size=20][b]Контроллер[/b]:[/size] [code]deleteExpense: function (component) { var action = component.get("c.deleteExpense"); var expId = component.get("v.expense.Id"); console.log('expId = ' + expId); action.setParams({expenseId:expId}) // Add callback behavior for when response is received action.setCallback(this, function(response) { var state = response.getState(); if (state === "SUCCESS") { // console.log(response.getReturnValue()); console.log("Success with state: " + state); } else { console.log("Failed with state: " + state); } }); // Send action off to be executed $A.enqueueAction(action); },[/code] [size=20][b]Apex-controller:[/b][/size] [code] @AuraEnabled public static void deleteExpense(String expenseId) { if (expenseId!=null) { Expense__c exp = [select id from expense__c where id=:expenseId]; delete exp; } } [/code]
Для кода пользуйся последней иконкой в меню
Будет красиво и понятно выводиться с табуляцией и line numbers
[i][/i]Для кода пользуйся последней иконкой в меню [img]https://salesforce-developer.ru/markitup/sets/bbcode/images/code.png[/img] Будет красиво и понятно выводиться с табуляцией и line numbers
готово. и правда красиво.
нет мыслей?
Вроде основы совсем, скелет ауры :)
[quote="Dmitry Shnyrev"][i][/i]Для кода пользуйся последней иконкой в меню [img]https://salesforce-developer.ru/markitup/sets/bbcode/images/code.png[/img] Будет красиво и понятно выводиться с табуляцией и line numbers[/quote] готово. и правда красиво. нет мыслей? Вроде основы совсем, скелет ауры :)
Вместо
component.get("v.expense.Id");
component.get("v.expense").Id;
Вместо [code]component.get("v.expense.Id");[/code] Надо [code]component.get("v.expense").Id;[/code]
В apex-контроллере на надо искать запись по ид, чтобы удалить. Можно просто удалить через Database.delete(id). Он помимо объекта принимает еще и ид объекта. А работает контроллер или нет - напиши юнит-тест. Так по крайней мере поймешь в каком контроллере собака порылась.
В apex-контроллере на надо искать запись по ид, чтобы удалить. Можно просто удалить через Database.delete(id). Он помимо объекта принимает еще и ид объекта. А работает контроллер или нет - напиши юнит-тест. Так по крайней мере поймешь в каком контроллере собака порылась.
Эта штука удобная, но потенциально опасная. В такой контроллер можно передать левый ID (другого объекта) и он его удалит. Через SELECT удалять безопаснее.
[quote="yurick"]Database.delete(id)[/quote] Эта штука удобная, но потенциально опасная. В такой контроллер можно передать левый ID (другого объекта) и он его удалит. Через SELECT удалять безопаснее.
Так ведь айди на то и айди, чтоб быть уникальным?)
[quote="Dmitry Shnyrev"][quote="yurick"]Database.delete(id)[/quote] Эта штука удобная, но потенциально опасная. В такой контроллер можно передать левый ID (другого объекта) и он его удалит. Через SELECT удалять безопаснее.[/quote] Так ведь айди на то и айди, чтоб быть уникальным?)
Только уникальность ID имеет ограничения и не всегда понятно оно уникально для всех ID всех таблиц или в рамках одной таблицы?
А так да, потенциально опасная фигня, когда приходит ID одного объекта, а удаляются все с этим же ID. Но если такая ситуация возможна, то это конкретный баг и разрабам системы надо его исправлять. Но боюсь, что тут все-таки все объекты имеют свой уникальный ID во всей системе, так что удалится именно то, что надо, а отсутствием лишнего запроса SOQL уменьшится нагрузка на сервер
Только уникальность ID имеет ограничения и не всегда понятно оно уникально для всех ID всех таблиц или в рамках одной таблицы? А так да, потенциально опасная фигня, когда приходит ID одного объекта, а удаляются все с этим же ID. Но если такая ситуация возможна, то это конкретный баг и разрабам системы надо его исправлять. Но боюсь, что тут все-таки все объекты имеют свой уникальный ID во всей системе, так что удалится именно то, что надо, а отсутствием лишнего запроса SOQL уменьшится нагрузка на сервер
Так ведь айди на то и айди, чтоб быть уникальным?)
ID конечно уникально! И я более того скажу - ID в Salesforce уникальны в пределах всего Salesforce (но я где-то встречал уточнение что уникальны в пределах одного инстанса).
Но я не про его уникальность. А про то что проверять надо перед тем как удаляешь, а не слепо удалять. В SF конечно злоумышленников нет, но может по случайности или из-за косяка разработки в метод удаления Contact придет ID от Account и тогда Account удалится втихую, а если бы через селект делалось, то вернулся бы пустой лист Контактов и ничего не удалилось бы.
Но никто не запрещает использовать Database.delete(id), просто есть нюанс про который надо знать.
[quote="Ian Skidkov"]Так ведь айди на то и айди, чтоб быть уникальным?)[/quote] ID конечно уникально! И я более того скажу - ID в Salesforce уникальны в пределах всего Salesforce (но я где-то встречал уточнение что уникальны в пределах одного инстанса). Но я не про его уникальность. А про то что проверять надо перед тем как удаляешь, а не слепо удалять. В SF конечно злоумышленников нет, но может по случайности или из-за косяка разработки в метод удаления Contact придет ID от Account и тогда Account удалится втихую, а если бы через селект делалось, то вернулся бы пустой лист Контактов и ничего не удалилось бы. Но никто не запрещает использовать Database.delete(id), просто есть нюанс про который надо знать.
Ну, там ньюансов куча, как и везде. Скилл разработчика тем выше, чем больше знаешь ньюансов. А возможность передачи невалидных данных существует везде, поэтому и надо делать проверки и на стороне сервера и стороне клиента.
Ну, там ньюансов куча, как и везде. Скилл разработчика тем выше, чем больше знаешь ньюансов. А возможность передачи невалидных данных существует везде, поэтому и надо делать проверки и на стороне сервера и стороне клиента.
Так ведь айди на то и айди, чтоб быть уникальным?)
ID конечно уникально! И я более того скажу - ID в Salesforce уникальны в пределах всего Salesforce (но я где-то встречал уточнение что уникальны в пределах одного инстанса).
Но я не про его уникальность. А про то что проверять надо перед тем как удаляешь, а не слепо удалять. В SF конечно злоумышленников нет, но может по случайности или из-за косяка разработки в метод удаления Contact придет ID от Account и тогда Account удалится втихую, а если бы через селект делалось, то вернулся бы пустой лист Контактов и ничего не удалилось бы.
Но никто не запрещает использовать Database.delete(id), просто есть нюанс про который надо знать.
Я в таких случаях делаю просто - Database.delete(new Contact(Id=id)), и другой тип не прокатит тут)
[quote="Dmitry Shnyrev"][quote="Ian Skidkov"]Так ведь айди на то и айди, чтоб быть уникальным?)[/quote] ID конечно уникально! И я более того скажу - ID в Salesforce уникальны в пределах всего Salesforce (но я где-то встречал уточнение что уникальны в пределах одного инстанса). Но я не про его уникальность. А про то что проверять надо перед тем как удаляешь, а не слепо удалять. В SF конечно злоумышленников нет, но может по случайности или из-за косяка разработки в метод удаления Contact придет ID от Account и тогда Account удалится втихую, а если бы через селект делалось, то вернулся бы пустой лист Контактов и ничего не удалилось бы. Но никто не запрещает использовать Database.delete(id), просто есть нюанс про который надо знать.[/quote] Я в таких случаях делаю просто - Database.delete(new Contact(Id=id)), и другой тип не прокатит тут)
т.е. он не создает новый контакт с известным id, а подтягивает из базы существующий? Воистину летопись индуистского написания. Харе Кришна.
т.е. он не создает новый контакт с известным id, а подтягивает из базы существующий? Воистину летопись индуистского написания. Харе Кришна.
т.е. он не создает новый контакт с известным id, а подтягивает из базы существующий? Воистину летопись индуистского написания. Харе Кришна.
Нет, именно и создает экземпляр класса Contact, который потом удаляется из базы
[quote="yurick"]т.е. он не создает новый контакт с известным id, а подтягивает из базы существующий? Воистину летопись индуистского написания. Харе Кришна.[/quote] Нет, именно и создает экземпляр класса Contact, который потом удаляется из базы
Database.delete(new Contact(Id=id))
Воистину летопись индуистского написания. Харе Кришна.
Кстати преинтереснейший вариант
И ID валидируется по типу объекта и SOQL запрос не тратится!
[quote="Raman Silin"] Database.delete(new Contact(Id=id))[/quote] [quote="yurick"] Воистину летопись индуистского написания. Харе Кришна.[/quote] Кстати преинтереснейший вариант :) И ID валидируется по типу объекта и SOQL запрос не тратится!
А, все, я понял его логику. Я так думаю, это единственное правильное решение, чтобы сервер на удалении объекта два раза не сувался с запросами в БД и одновременно уменьшит нагрузку на сервер в плане времени поиска записи.
А, все, я понял его логику. Я так думаю, это единственное правильное решение, чтобы сервер на удалении объекта два раза не сувался с запросами в БД и одновременно уменьшит нагрузку на сервер в плане времени поиска записи.
Не сработало
Вместо
component.get("v.expense.Id");
Надоcomponent.get("v.expense").Id;
Не сработало :( [quote="camamber"]Вместо [code]component.get("v.expense.Id");[/code] Надо [code]component.get("v.expense").Id;[/code][/quote]
Не сработало
Вместо
component.get("v.expense.Id");
Надоcomponent.get("v.expense").Id;
В консоли зацикливается:
deleteExpense: function (component) {
var action = component.get("c.deleteExpense");
var expId = component.get("v.expense").Id;
console.log('expId = ' + expId);
action.setParams({'expenseId':expId})
// Add callback behavior for when response is received
action.setCallback(this, function(response) {
var state = response.getState();
if (state === "SUCCESS") {
// console.log(response.getReturnValue());
console.log("Success with state: " + state);
}}
Success with state: SUCCESS expenseItem.js:37
expId = a041i000009oVznAAE expenseItem.js:44
Success with state: SUCCESS expenseItem.js:37
expId = a041i000009oVznAAE expenseItem.js:44
Success with state: SUCCESS expenseItem.js:37
[quote="Ian Skidkov"]Не сработало :( [quote="camamber"]Вместо [code]component.get("v.expense.Id");[/code] Надо [code]component.get("v.expense").Id;[/code][/quote][/quote] В консоли зацикливается: [code]deleteExpense: function (component) { var action = component.get("c.deleteExpense"); var expId = component.get("v.expense").Id; console.log('expId = ' + expId); action.setParams({'expenseId':expId}) // Add callback behavior for when response is received action.setCallback(this, function(response) { var state = response.getState(); if (state === "SUCCESS") { // console.log(response.getReturnValue()); console.log("Success with state: " + state); }}[/code] Success with state: SUCCESS expenseItem.js:37 expId = a041i000009oVznAAE expenseItem.js:44 Success with state: SUCCESS expenseItem.js:37 expId = a041i000009oVznAAE expenseItem.js:44 Success with state: SUCCESS expenseItem.js:37
Не сработало
Вместо
component.get("v.expense.Id");
Надоcomponent.get("v.expense").Id;
В консоли зацикливается:
deleteExpense: function (component) {
var action = component.get("c.deleteExpense");
var expId = component.get("v.expense").Id;
console.log('expId = ' + expId);
action.setParams({'expenseId':expId})
// Add callback behavior for when response is received
action.setCallback(this, function(response) {
var state = response.getState();
if (state === "SUCCESS") {
// console.log(response.getReturnValue());
console.log("Success with state: " + state);
}}
Success with state: SUCCESS expenseItem.js:37
expId = a041i000009oVznAAE expenseItem.js:44
Success with state: SUCCESS expenseItem.js:37
expId = a041i000009oVznAAE expenseItem.js:44
Success with state: SUCCESS expenseItem.js:37
У тебя метод в js и метод в apex контроллере называються одинаково "deleteExpense", измини одно название, чтобы метод в js и метод apex в контроллере имели разные названия
[quote="Ian Skidkov"][quote="Ian Skidkov"]Не сработало :( [quote="camamber"]Вместо [code]component.get("v.expense.Id");[/code] Надо [code]component.get("v.expense").Id;[/code][/quote][/quote] В консоли зацикливается: [code]deleteExpense: function (component) { var action = component.get("c.deleteExpense"); var expId = component.get("v.expense").Id; console.log('expId = ' + expId); action.setParams({'expenseId':expId}) // Add callback behavior for when response is received action.setCallback(this, function(response) { var state = response.getState(); if (state === "SUCCESS") { // console.log(response.getReturnValue()); console.log("Success with state: " + state); }}[/code] Success with state: SUCCESS expenseItem.js:37 expId = a041i000009oVznAAE expenseItem.js:44 Success with state: SUCCESS expenseItem.js:37 expId = a041i000009oVznAAE expenseItem.js:44 Success with state: SUCCESS expenseItem.js:37[/quote] У тебя метод в js и метод в apex контроллере называються одинаково "deleteExpense", измини одно название, чтобы метод в js и метод apex в контроллере имели разные названия
Не сработало
Вместо
component.get("v.expense.Id");
Надоcomponent.get("v.expense").Id;
В консоли зацикливается:
deleteExpense: function (component) {
var action = component.get("c.deleteExpense");
var expId = component.get("v.expense").Id;
console.log('expId = ' + expId);
action.setParams({'expenseId':expId})
// Add callback behavior for when response is received
action.setCallback(this, function(response) {
var state = response.getState();
if (state === "SUCCESS") {
// console.log(response.getReturnValue());
console.log("Success with state: " + state);
}}
Success with state: SUCCESS expenseItem.js:37
expId = a041i000009oVznAAE expenseItem.js:44
Success with state: SUCCESS expenseItem.js:37
expId = a041i000009oVznAAE expenseItem.js:44
Success with state: SUCCESS expenseItem.js:37
У тебя метод в js и метод в apex контроллере называються одинаково "deleteExpense", измини одно название, чтобы метод в js и метод apex в контроллере имели разные названия
спасибо! best answer! :D
[quote="camamber"][quote="Ian Skidkov"][quote="Ian Skidkov"]Не сработало :( [quote="camamber"]Вместо [code]component.get("v.expense.Id");[/code] Надо [code]component.get("v.expense").Id;[/code][/quote][/quote] В консоли зацикливается: [code]deleteExpense: function (component) { var action = component.get("c.deleteExpense"); var expId = component.get("v.expense").Id; console.log('expId = ' + expId); action.setParams({'expenseId':expId}) // Add callback behavior for when response is received action.setCallback(this, function(response) { var state = response.getState(); if (state === "SUCCESS") { // console.log(response.getReturnValue()); console.log("Success with state: " + state); }}[/code] Success with state: SUCCESS expenseItem.js:37 expId = a041i000009oVznAAE expenseItem.js:44 Success with state: SUCCESS expenseItem.js:37 expId = a041i000009oVznAAE expenseItem.js:44 Success with state: SUCCESS expenseItem.js:37[/quote] У тебя метод в js и метод в apex контроллере называються одинаково "deleteExpense", измини одно название, чтобы метод в js и метод apex в контроллере имели разные названия[/quote] спасибо! best answer! :D
спасибо! best answer! :D
А ещё правильнее будет держать всю бизнесу логику в js хелпере, а не js контроллере и там не нужно заботиться, чтобы имя функции отличалось от имени вызываемого апекс метода.
[quote="Ian Skidkov"]спасибо! best answer! :D[/quote] А ещё правильнее будет держать всю бизнесу логику в js хелпере, а не js контроллере и там не нужно заботиться, чтобы имя функции отличалось от имени вызываемого апекс метода.
Погибаю, помогите пожалуйста - компонент не ловит Event из другого
Lightning Event:
tripEventer, attribute - trip, Trip__c - настроен верно, остальные с ним работают.
Component Item:
<aura:registerEvent name="openTripEvent" type="c:tripEventer"/>
<lightning:button class="slds-align_absolute-center" onclick="{!c.openTripAction}" label="Открыть заявку"/><br/>
openTripAction: function (component, event, helper) {
var action = component.getEvent('openTripEvent');
action.setParam('trip', component.get("v.trip"));
action.fire();
alert('gree from item button');
}
<aura:attribute type="String" name="test" default="nothing"/>
<aura:handler name="openTripEvent" action="{!c.handleOpenForm}" event="c:tripEventer"/>
Component Form Controller:
handleOpenForm: function (component, event, helper) {
component.set("v.test", "something");
alert('im here');
}
Погибаю, помогите пожалуйста - компонент не ловит Event из другого Lightning Event: tripEventer, attribute - trip, Trip__c - настроен верно, остальные с ним работают. Component Item: [code]<aura:registerEvent name="openTripEvent" type="c:tripEventer"/> <lightning:button class="slds-align_absolute-center" onclick="{!c.openTripAction}" label="Открыть заявку"/><br/>[/code] Component Item Controller: [code]openTripAction: function (component, event, helper) { var action = component.getEvent('openTripEvent'); action.setParam('trip', component.get("v.trip")); action.fire(); alert('gree from item button'); }[/code] Component Form: [code] <aura:attribute type="String" name="test" default="nothing"/> <aura:handler name="openTripEvent" action="{!c.handleOpenForm}" event="c:tripEventer"/>[/code] Component Form Controller: [code]handleOpenForm: function (component, event, helper) { component.set("v.test", "something"); alert('im here'); }[/code]
Погибаю, помогите пожалуйста - компонент не ловит Event из другого
Пока обнаружил, что проблема в том, что компонент Item находится внутри компонента List, который сосед компонента Form.
Получается Form недосягаем для Item.
[quote="Ian Skidkov"]Погибаю, помогите пожалуйста - компонент не ловит Event из другого [/quote] Пока обнаружил, что проблема в том, что компонент Item находится внутри компонента List, который сосед компонента Form. Получается Form недосягаем для Item.