Вот что я собрал, чтобы помочь понять разницу
public interface ICovariant<out T> { }
public interface IContravariant<in T> { }
public class Covariant<T> : ICovariant<T> { }
public class Contravariant<T> : IContravariant<T> { }
public class Fruit { }
public class Apple : Fruit { }
public class TheInsAndOuts
{
public void Covariance()
{
ICovariant<Fruit> fruit = new Covariant<Fruit>();
ICovariant<Apple> apple = new Covariant<Apple>();
Covariant(fruit);
Covariant(apple); //apple is being upcasted to fruit, without the out keyword this will not compile
}
public void Contravariance()
{
IContravariant<Fruit> fruit = new Contravariant<Fruit>();
IContravariant<Apple> apple = new Contravariant<Apple>();
Contravariant(fruit); //fruit is being downcasted to apple, without the in keyword this will not compile
Contravariant(apple);
}
public void Covariant(ICovariant<Fruit> fruit) { }
public void Contravariant(IContravariant<Apple> apple) { }
}
tldr
ICovariant<Fruit> apple = new Covariant<Apple>(); //because it's covariant
IContravariant<Apple> fruit = new Contravariant<Fruit>(); //because it's contravariant
Вы должны быть в состоянии прослушать событие MDCSnackbar:closed
, задокументированное в разделе событий документации .
Поскольку вы пометили свой вопрос vue.js
, я предполагаю, что вы интегрируете MDC в приложение Vue. В таком случае я бы посоветовал вам взглянуть на vue-mdc-adapter
. У них также есть более специфичная для Vue документация для закусочной . Ваша закусочная может быть примерно такой:
<mdc-snackbar v-model="snack" @hide="handleHide"></mdc-snackbar>
@hide
- уведомить слушателей, что закусочная была скрыта. BLOCKQUOTE>
Я решил это:
const snackbarElement = document.querySelector(".mdc-snackbar");
this.snackbar = new MDCSnackbar(snackbarElement);
snackbarElement.addEventListener("MDCSnackbar:closed", (event) => {
Раньше я пытался добавить eventListener к самой закусочной bar