aura:component issues :)

aura:component issues :)

Привет!
Пока только познаю, но что может быть не так?
Нужно удалить запись в 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;
}
}

Для кода пользуйся последней иконкой в меню

Будет красиво и понятно выводиться с табуляцией и line numbers

Dmitry Shnyrev
Для кода пользуйся последней иконкой в меню

Будет красиво и понятно выводиться с табуляцией и line numbers

готово. и правда красиво.

нет мыслей?
Вроде основы совсем, скелет ауры :)

Вместо

component.get("v.expense.Id");

Надо
component.get("v.expense").Id;

В apex-контроллере на надо искать запись по ид, чтобы удалить. Можно просто удалить через Database.delete(id). Он помимо объекта принимает еще и ид объекта. А работает контроллер или нет - напиши юнит-тест. Так по крайней мере поймешь в каком контроллере собака порылась.

yurick
Database.delete(id)

Эта штука удобная, но потенциально опасная. В такой контроллер можно передать левый ID (другого объекта) и он его удалит. Через SELECT удалять безопаснее.

Dmitry Shnyrev
yurick
Database.delete(id)

Эта штука удобная, но потенциально опасная. В такой контроллер можно передать левый ID (другого объекта) и он его удалит. Через SELECT удалять безопаснее.

Так ведь айди на то и айди, чтоб быть уникальным?)

Только уникальность ID имеет ограничения и не всегда понятно оно уникально для всех ID всех таблиц или в рамках одной таблицы?
А так да, потенциально опасная фигня, когда приходит ID одного объекта, а удаляются все с этим же ID. Но если такая ситуация возможна, то это конкретный баг и разрабам системы надо его исправлять. Но боюсь, что тут все-таки все объекты имеют свой уникальный ID во всей системе, так что удалится именно то, что надо, а отсутствием лишнего запроса SOQL уменьшится нагрузка на сервер

Ian Skidkov
Так ведь айди на то и айди, чтоб быть уникальным?)

ID конечно уникально! И я более того скажу - ID в Salesforce уникальны в пределах всего Salesforce (но я где-то встречал уточнение что уникальны в пределах одного инстанса).

Но я не про его уникальность. А про то что проверять надо перед тем как удаляешь, а не слепо удалять. В SF конечно злоумышленников нет, но может по случайности или из-за косяка разработки в метод удаления Contact придет ID от Account и тогда Account удалится втихую, а если бы через селект делалось, то вернулся бы пустой лист Контактов и ничего не удалилось бы.

Но никто не запрещает использовать Database.delete(id), просто есть нюанс про который надо знать.

Ну, там ньюансов куча, как и везде. Скилл разработчика тем выше, чем больше знаешь ньюансов. А возможность передачи невалидных данных существует везде, поэтому и надо делать проверки и на стороне сервера и стороне клиента.

Dmitry Shnyrev
Ian Skidkov
Так ведь айди на то и айди, чтоб быть уникальным?)

ID конечно уникально! И я более того скажу - ID в Salesforce уникальны в пределах всего Salesforce (но я где-то встречал уточнение что уникальны в пределах одного инстанса).

Но я не про его уникальность. А про то что проверять надо перед тем как удаляешь, а не слепо удалять. В SF конечно злоумышленников нет, но может по случайности или из-за косяка разработки в метод удаления Contact придет ID от Account и тогда Account удалится втихую, а если бы через селект делалось, то вернулся бы пустой лист Контактов и ничего не удалилось бы.

Но никто не запрещает использовать Database.delete(id), просто есть нюанс про который надо знать.

Я в таких случаях делаю просто - Database.delete(new Contact(Id=id)), и другой тип не прокатит тут)

т.е. он не создает новый контакт с известным id, а подтягивает из базы существующий? Воистину летопись индуистского написания. Харе Кришна.

yurick
т.е. он не создает новый контакт с известным id, а подтягивает из базы существующий? Воистину летопись индуистского написания. Харе Кришна.

Нет, именно и создает экземпляр класса Contact, который потом удаляется из базы

Raman Silin
Database.delete(new Contact(Id=id))

yurick
Воистину летопись индуистского написания. Харе Кришна.

Кстати преинтереснейший вариант
И ID валидируется по типу объекта и SOQL запрос не тратится!

А, все, я понял его логику. Я так думаю, это единственное правильное решение, чтобы сервер на удалении объекта два раза не сувался с запросами в БД и одновременно уменьшит нагрузку на сервер в плане времени поиска записи.

Не сработало

camamber
Вместо
component.get("v.expense.Id");

Надо
component.get("v.expense").Id;

Ian Skidkov
Не сработало

camamber
Вместо
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

Ian Skidkov
Ian Skidkov
Не сработало

camamber
Вместо
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 в контроллере имели разные названия

camamber
Ian Skidkov
Ian Skidkov
Не сработало

camamber
Вместо
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

Ian Skidkov
спасибо! best answer! :D

А ещё правильнее будет держать всю бизнесу логику в 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/>


Component Item Controller:
openTripAction: function (component, event, helper) {

var action = component.getEvent('openTripEvent');
action.setParam('trip', component.get("v.trip"));
action.fire();
alert('gree from item button');
}




Component Form:
<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');
}

Ian Skidkov
Погибаю, помогите пожалуйста - компонент не ловит Event из другого

Пока обнаружил, что проблема в том, что компонент Item находится внутри компонента List, который сосед компонента Form.

Получается Form недосягаем для Item.

Interesting information? Help us, post link to social media..