Как переопределить функцию закрытия диалога? - PullRequest
0 голосов
/ 04 октября 2019

Я инкапсулирую службу диалога, чтобы добавить некоторые параметры, такие как анимация,

и пытаюсь переопределить функцию закрытия:

 const closeFunction = dialogRef.close;
 const closeHandler = (dialogResult?: R) => {
        wrapper.animate([keyFrame0, keyFrame100], { duration: 1000, easing: 'ease-out' });
        setTimeout(() => closeFunction(dialogResult), 500);
      };
 dialogRef.close = (dialogResult?: R) => closeHandler(dialogResult);

Ошибка при закрытии диалога:

TypeError: Cannot set property '_result' of undefined

что мне нужно сделать еще? какая-то привязка? демонстрация стекаблиц

1 Ответ

0 голосов
/ 04 октября 2019

Способ closeFunction был определен как недопустимая функция. Чтобы ваш пример работал, функция close должна принять диалог в качестве параметра или отреагировать, если он не определен. Попробуйте это:

const closeFunction = (dialog?) => {
  if ( dialog ) {
     // Valid dialog
     dialog.close
  } else {
    // Undefined dialog
    console.log( 'Dialog does not exist' );
  }
};

const closeHandler = (dialog?) => {
   closeFunction(dialog)
};

dialogRef.close = (dialog?) => {
   closeHandler(dialog);
}

EDIT

Приведенный выше код избавляет от сообщения об ошибке из консоли, но фактически не перезаписывает функцию закрытия. Я не думаю, что возможно перезаписать функцию напрямую, но обходной путь должен определить новый метод, то есть customClose, который применяет пользовательский код и затем закрывает диалоговое окно. Вот как это работает:

// Declare a new method (customClose) on the dialogRef after dialog opens
// This new method stores the logic you want to apply before closing
dialogRef['customClose'] = () => {
   console.log( 'Apply 2 seconds animation here' );
   setTimeout(() => dialogRef.close() , 2000);
}

// Then, on the onNoClick method call the custom method instead
onNoClick(): void {
    this.dialogRef['customClose']();
}

Фактическая часть анимации не была рассмотрена. Вы можете увидеть это в действии, проверив консоль на этой демонстрации стекаблиц

...