Добавить дополнительные методы в библиотечную функцию

Я использую библиотеку под названием Golden Layout, в ней есть функция destroy который закроет все окно приложения, при закрытии окна или рефеш

Мне нужно добавить дополнительный метод к destroy функция. Мне нужно удалить все местные хранилища.

Как мне это сделать? Пожалуйста помоги

Ниже приведен код плагина.

lm.LayoutManager = function( config, container ) {
....    
destroy: function() {
            if( this.isInitialised === false ) {
                return;
            }
            this._onUnload();
            $( window ).off( 'resize', this._resizeFunction );
            $( window ).off( 'unload beforeunload', this._unloadFunction );
            this.root.callDownwards( '_$destroy', [], true );
            this.root.contentItems = [];
            this.tabDropPlaceholder.remove();
            this.dropTargetIndicator.destroy();
            this.transitionIndicator.destroy();
            this.eventHub.destroy();

            this._dragSources.forEach( function( dragSource ) {
                dragSource._dragListener.destroy();
                dragSource._element = null;
                dragSource._itemConfig = null;
                dragSource._dragListener = null;
            } );
            this._dragSources = [];
        },

Я могу получить доступ к методу уничтожения в компоненте, как это

this.layout = new GoldenLayout(this.config, this.layoutElement.nativeElement);

this.layout.destroy();`

Мой код

@HostListener('window:beforeunload', ['$event'])
beforeunloadHandler(event) {
  var originalDestroy = this.layout.destroy;
  this.layout.destroy = function() {
      // Call the original
      originalDestroy.apply(this, arguments);
        localStorage.clear();
  };
}

1 ответ

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

Выполняется всякий раз, когда предмет уничтожается.

Если по какой-то причине вы не можете, общий ответ таков: вы можете легко обернуть функцию:

var originalDestroy = this.layout.destroy;
this.layout.destroy = function() {
    // Call the original
    originalDestroy.apply(this, arguments);
    // Do your additional work here
};

Вы можете сделать это для всех случаев, если необходимо, изменив GoldenLayout.prototype:

var originalDestroy = GoldenLayout.prototype.destroy;
GoldenLayout.prototype.destroy = function() {
    // Call the original
    originalDestroy.apply(this, arguments);
    // Do your additional work here
};

Пример:

// Stand-in for golden laout
function GoldenLayout() {
}
GoldenLayout.prototype.destroy = function() {
    console.log("Standard functionality");
};

// Your override:
var originalDestroy = GoldenLayout.prototype.destroy;
GoldenLayout.prototype.destroy = function() {
    // Call the original
    originalDestroy.apply(this, arguments);
    // Do your additional work here
    console.log("Custom functionality");
};

// Use
var layout = new GoldenLayout();
layout.destroy();

Привязка к золотой раскладке - это прямая цель мероприятий.

Как вкратце затронул T.J. Crowder, естьitemDestroyed событие, которое вызывается, когда элемент в макете уничтожается.

Вы можете просто прослушать это событие следующим образом:

this.layout.on('itemDestroyed', function() {
    localStorage.clear();
})

Однако это событие вызывается каждый раз, когда что-либо уничтожается, и распространяется вниз по дереву, даже при закрытии вкладки. Это означает, что если вы вызовете destroy в корне макета, вы получите событие для каждогоRowOrColumn, Stack а также Component

Я бы рекомендовал проверить элемент, переданный в событие, и игнорировать, если не главное окно (root пункт)

this.layout.on('itemDestroyed', function(item) {
    if (item.type === "root") {
        localStorage.clear();
    }
})
Другие вопросы по тегам