Расширить класс ember при определенном условии

#javascript #class #ember.js #extends #discourse

#javascript #класс #ember.js #расширяет #обсуждение

Вопрос:

Возможно ли расширить класс Ember при условии? Что-то вроде этого:

 A.reopen({
  if (condition) {
    init: function() {
      this.super();
      // some functionality
    }.on('didInsertElement');
  }
})
  

В настоящее время у меня есть такой шаблон:

 A.reopen({
  init: function() {
    this.super();
    if (condition) {
      // some stuff
    }
  }.on('didInsertElement'),

  cleanup: function() {
    if (condition) {
      // some stuff
    }
  }.on('willDestroyElement')
})
  

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

 A.reopen({
  if (condition) {
    init: function() {
      this.super();
      // some functionality
    }.on('didInsertElement'),

    clear_up: function() {
      // some stuff
    }.on('willDestroyElement')
  }
})
  

Все расширения класса сделаны в плагине для обсуждения

Комментарии:

1. Почему бы не переключить первую и вторую строку? Какой класс вы хотите повторно открыть и каков ваш вариант использования?

2. @Keo Я обновил вопрос, чтобы прояснить мой случай

3. Разве ответ Кео вам не помогает? if (condition) { A.reopen({

Ответ №1:

Похоже, вы хотите то, что в Java называлось бы абстрактным классом.

 Ember.Component.extend({ // abstract class

  doSomeInit: Ember.K,

  doSomeCleaning: Ember.K,

  didInsertElement: function() {
    this.super(..arguments);
    this.doSomeInit();
  },

  willDestroyElement: function() {
    this.doSomeCleaning();
  }
})

// class A
Ember.Component.extend(MyIncompleteClass, {

  doSomeInit: function() { /* etc */ },

  doSomeCleaning: function() { /* etc */ }

});

// class B
Ember.Component.extend(MyIncompleteClass, {

  doSomeInit: function() { /* etc */ },

  doSomeCleaning: function() { /* etc */ }

});
  

Примечание: лучше переопределить перехваты жизненного цикла, чем использовать Ember.on, чтобы гарантировать порядок выполнения; это в случае нескольких Ember.on для одного и того же события.

Комментарии:

1. Я расширяю классы ember из плагина, я не могу создавать свои собственные классы, даже абстрактные

2. не возражаете обновить свой вопрос этим фрагментом? как вы расширяете плагин? (я полагаю, надстройка ember cli)