Не удается прочитать свойство 'xxx.xxx' из неопределенного - PullRequest
1 голос
/ 27 марта 2020

Обновление meteor (с 1,4 до 1,7) и react (с 15,3,2 до 16,8,6). Использование метеорной атмосферы.

В одной части кода, с помощью которой обрабатывается команда удаления, консоль имеет следующую знакомую, но невежественную ошибку:

Uncaught TypeError: Cannot read property 'displayConfirmation' of undefined
    at remove (ticket.js:48)
    at onClick (list.jsx:180)
    at HTMLUnknownElement.callCallback (modules.js?hash=199fa8ade393a4d3c92b5b590836441c4936d1d6:54371)
    at Object.invokeGuardedCallbackDev (modules.js?hash=199fa8ade393a4d3c92b5b590836441c4936d1d6:54420)
    at invokeGuardedCallback (modules.js?hash=199fa8ade393a4d3c92b5b590836441c4936d1d6:54475)
    at invokeGuardedCallbackAndCatchFirstError (modules.js?hash=199fa8ade393a4d3c92b5b590836441c4936d1d6:54489)
    at executeDispatch (modules.js?hash=199fa8ade393a4d3c92b5b590836441c4936d1d6:54572)
    at executeDispatchesInOrder (modules.js?hash=199fa8ade393a4d3c92b5b590836441c4936d1d6:54597)
    at executeDispatchesAndRelease (modules.js?hash=199fa8ade393a4d3c92b5b590836441c4936d1d6:57461)
    at executeDispatchesAndReleaseTopLevel (modules.js?hash=199fa8ade393a4d3c92b5b590836441c4936d1d6:57470)

Ожидание: Всплывающее диалоговое окно с запросом подтверждения перед удалением.

Ниже приведена часть кодов:

components / list.jsx

...
onClick={() => actions.delete && remove()}><img src={require('/crm/images/icon_delete.png')}/> Delete all selected</span>
...

акции / тикет. js

import * as React from 'react';

import { push, goBack } from 'react-router-redux';
import { reset, SubmissionError } from 'redux-form';

import { notify, confirm } from '../../core/actions';

import {Tickets} from '../../../../lib/collections';

import {
  SELECT_TICKETS, UNSELECT_TICKETS, CHANGE_TICKETS_PAGE, SORT_TICKETS,

  LOAD_TICKET, UNLOAD_TICKET,
  LOAD_ACTIVITIES, UNLOAD_ACTIVITIES,

  CHANGE_CATEGORY, CHANGE_STATUS, CHANGE_DATE,
} from './actionTypes';

export default {
  remove(context) {
    const {Meteor, Store} = context;
    let tickets = Store.getState().tickets.list.selectedTickets;

    confirm.displayConfirmation(context, {        // <-- It can't seem to recognize this
      title: 'Removing Tickets',
      message: "<p>Are you sure you want to delete below tickets?<ul>{tickets.map((ticket, i) => <li key={'msg-' + i}>{ticket.ticketNo}</li>)}</ul></p>",
      callback: () => {
        Meteor.call('tickets.delete', tickets.map(ticket => ticket._id), (err) => {
          if (err) {
            return;
          }

          notify.sendNotify(context, `${tickets.map(ticket => ticket.ticketNo).join(', ')} ${tickets.length > 1 ? 'have' : 'has'} been deleted.`);
          unselect(context);
        });

      }
    });
  },
};

.. / .. / core / actions / index. js

import notify from './notify';
import confirm from './confirm';

export default {
  notify,
  confirm
};

.. / .. / ядро ​​/ действия / подтвердить. js

let dismissConfirmation = ({Store}) => {
  Store.dispatch({
    type: DISMISS_CONFIRMATION
  });
};

export default {
  displayConfirmation({Store}, {title, message, callback}) {
    Store.dispatch({
      type: DISPLAY_CONFIRMATION,
      title,
      message,
      callback
    });
  },

  dismissConfirmation,

  confirm(context) {
    let {Store} = context;

    Store.getState().confirm.callback();
    dismissConfirmation(context);
  }
};

Любая помощь в основном приветствуется!

- РЕДАКТИРОВАТЬ -

Попытка изменить подтверждение. js на:

.. / .. / core / actions / Подтвердить. js

export const dismissConfirmation = ({Store}) => {
  Store.dispatch({
    type: DISMISS_CONFIRMATION
  });
};

export const displayConfirmation = ({Store}, {title, message, callback}) => {
  Store.dispatch({
    type: DISPLAY_CONFIRMATION,
    title,
    message,
    callback
  });
};

export const confirm = (context) => {
  let {Store} = context;

  Store.getState().confirm.callback();
  dismissConfirmation(context);
};

Но все равно появляется та же неопределенная ошибка.

Если я попытался изменить confirm.displayConfirmation на displayConfirmation при action / ticket. js, тогда получит следующую ошибку:

Uncaught TypeError: displayConfirmation is not a function

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Измените подтверждение. js на это.

export const dismissConfirmation = ({Store}) => {
  Store.dispatch({
    type: DISMISS_CONFIRMATION
  });
};


export const displayConfirmation({Store}, {title, message, callback}) {
  Store.dispatch({
    type: DISPLAY_CONFIRMATION,
    title,
    message,
    callback
  });
},



export const confirm(context) {
  let {Store} = context;

  Store.getState().confirm.callback();
  dismissConfirmation(context);
}

Теперь вы можете импортировать эти функции в другие файлы, подобные этому

import { 
  displayConfirmation, 
  confirm, 
  dismissConfirmation 
} from '../../core/actions';

Вы смешиваете понятие именованного экспорта с экспортом по умолчанию, пожалуйста, прочитайте эту статью Именованные экспорты по сравнению с экспортом по умолчанию

0 голосов
/ 08 апреля 2020

Как подсказывает @mzparacha, ниже приведены окончательные изменения.

.. / .. / core / actions / Подтвердить. js

export const dismissConfirmation = ({Store}) => {
  Store.dispatch({
    type: DISMISS_CONFIRMATION
  });
};

export const displayConfirmation = ({Store}, {title, message, callback}) => {
  Store.dispatch({
    type: DISPLAY_CONFIRMATION,
    title,
    message,
    callback
  });
};

export const confirm = (context) => {
  let {Store} = context;

  Store.getState().confirm.callback();
  dismissConfirmation(context);
};

Однако в части импорта сделайте это, как показано ниже:

action / ticket. js

import * as confirm from '../../core/actions/confirm';
...

А остальное осталось. Работает как шарм. Спасибо @ mzparacha

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...