Запись компонента осветления Привязка обновленного метода вызывает событие устаревших данных - PullRequest
0 голосов
/ 06 мая 2020

У меня есть компонент освещения, который будет вызывать метод контроллера при обновлении. Ниже приведен код компонента, контроллера и помощника: Код компонента:

    <force:recordData aura:id="forceRecord"
        recordId="{!v.recordId}" 
        layoutType="FULL"
        targetRecord="{!v._record}"
        targetFields="{!v.simpleRecord}"
        targetError="{!v._error}"
        mode="EDIT"
        recordUpdated="{!c.recordUpdated}" />

Код контроллера:

({
    doInit : function(component, event, helper) {
        helper.checkStatus(component,event,helper);        
    },

    recordUpdated : function(component, event, helper) {
        var changeType = event.getParams().changeType;

        console.log('changeType IS: '+ changeType);

        // changeType = LOADED  -- when record is created.
        if (changeType === "ERROR") { /* handle error; do this first! */ }
        else if (changeType === "LOADED") {
        }
        else if (changeType === "REMOVED") { /* handle record removal */ }
        else if (changeType === "CHANGED") {
            var recordId = component.get("v.recordId");
            console.log('Updated record Id: '+ recordId);
            helper.callAnotherMethod(component, event, helper);  
         }
    }
})

Предположим, я получаю доступ к платежу (Id в URL: a001l000005JP5mAAG) страницу в браузере, изменил какое-то поле в ней и сохранил. вызывается метод recordUpdated, и он входит в условие ИЗМЕНЕНО.

Я открываю другой платеж (Id в URL: a001l000005HK5mBBK) в том же окне браузера, изменяю значение поля в этом платеже и сохраняю его. В этот момент метод recordUpdated вызывается дважды: один раз для старого платежа и один раз для нового платежа.

Если я смотрю в консоль браузера, я вижу журнал, как показано ниже:

changeType IS: CHANGED
Updated record Id: a001l000005JP5mAAG
changeType IS: CHANGED
Updated record Id: a001l000005HK5mBBK

Not уверен, почему он звонит дважды и как его остановить? Кто-нибудь может объяснить мне, почему он так себя ведет и как это остановить?

Удивительно, если я открываю больше платежей в том же окне браузера и изменяю их, он продолжает добавлять событие recordUpdated для текущего платежа, а также вызывает событие обновления предыдущих платежей с их идентификатором

1 Ответ

0 голосов
/ 08 мая 2020

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

Я обнаружил, что хотя возникло несколько событий, но если я проверю измененные поля в этих событиях, у них не будет никаких данных, кроме измененного в текущем экземпляре, поэтому я начал проверять измененные поля, как показано ниже, и если у них нет никаких элементов в изменил объект, и я продолжаю свой путь.

    recordUpdated : function(component, event, helper) {
        var changeType = event.getParams().changeType;
        var changedFields = event.getParams().changedFields;

        console.log('changeType IS: '+ changeType);

        // changeType = LOADED  -- when record is created.
        if (changeType === "ERROR") { /* handle error; do this first! */ }
        else if (changeType === "LOADED") {
        }
        else if (changeType === "REMOVED") { /* handle record removal */ }
        else if (changeType === "CHANGED") {
            if (Object.keys(changedFields).length == 1 
                && Object.keys(Object.values(changedFields)[0])[0] == 'SystemModstamp')
            { 
                // this is a case where nothing modified but due to issue in lightning event handlers all the 
                // previous events are fired along with the current event, hence avoiding action on such events.
            }
            else
            {
                var recordId = component.get("v.recordId");
                console.log('To be updated record Id: '+ recordId);
                console.log('changedFields: '+ JSON.stringify(changedFields));

                helper.callAnyMethod(component, event, helper);
            }
        }

    },
    destoryCmp : function (component, event, helper) {
        component.destroy();
    },
})

Эта проблема решена для меня. Надеюсь, это поможет, если кто-то еще столкнется с подобной проблемой.

...