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

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;
}
}

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

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

Будет красиво и понятно выводиться с табуляцией и 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). Он помимо объекта принимает еще и ид объекта. А работает контроллер или нет - напиши юнит-тест. Так по крайней мере поймешь в каком контроллере собака порылась.

yurick
Database.delete(id)

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

[quote="yurick"]Database.delete(id)[/quote]
Эта штука удобная, но потенциально опасная. В такой контроллер можно передать левый ID (другого объекта) и он его удалит. Через SELECT удалять безопаснее.

Dmitry Shnyrev
yurick
Database.delete(id)

Эта штука удобная, но потенциально опасная. В такой контроллер можно передать левый 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 уменьшится нагрузка на сервер

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

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), просто есть нюанс про который надо знать.

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

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

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

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, а подтягивает из базы существующий? Воистину летопись индуистского написания. Харе Кришна.

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

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

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

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

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

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

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

[quote="Raman Silin"] Database.delete(new Contact(Id=id))[/quote]
[quote="yurick"] Воистину летопись индуистского написания. Харе Кришна.[/quote]
Кстати преинтереснейший вариант :)
И ID валидируется по типу объекта и SOQL запрос не тратится!

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

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


Не сработало

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

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

[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 

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

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

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

[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

Ian Skidkov
спасибо! 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/>


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

Погибаю, помогите пожалуйста - компонент не ловит 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]

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

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

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

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

[/quote]

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

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