Невозможно уничтожить привязку нокаута (MetroJS) при переходе на другие вкладки - PullRequest
0 голосов
/ 26 сентября 2018

Я использую машинопись и нокаут.В моем примере я могу создавать плитки и устанавливать транзакции, используя пользовательский редактор кендо, такой как fade in fade out или carousel.На основании таймера, установленного для плитки, будут отображаться данные.Однако, когда я перехожу на другие вкладки, событие таймера пытается найти данные тайла, которые больше не доступны, что приводит к ошибке.Я хочу убедиться, что при переходе на другие вкладки все плитки, имеющие события транзакции, должны быть уничтожены или отменены.Я пытался использовать ko.utils.domNodeDisposal.addDisposeCallback (element, function (), но он никогда не вызывается.

 init: (element: any, valueAccessor: any, allBindings: any, viewModel: any, bindingContext: any): void => {

        tileState.editableTileInit(element, valueAccessor, viewModel);
        ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
            console.log("I have been called");
        });
    },
    update: (element: any, valueAccessor: any, allBindings: any, viewModel: any, bindingContext: any): void => {

        tileState.editableTileUpdate(element, valueAccessor, viewModel);
    }

метод init создаст плитки

if (viewModel.editMode() === true) LiveTiles.setupClickHandler(element, viewModel, true);

var sub = viewModel.editMode.subscribe(x => LiveTiles.setupClickHandler(element, viewModel, x));

ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
    sub.dispose();
    TileEditor.destroyEditor(element, viewModel);
    LiveTiles.destroyTile(element, viewModel);
});

метод обновления обновитплитки, если пользователь обновляет плитку во время выполнения.

 TileEditor.destroyEditor(element, viewModel);
    LiveTiles.createTile(element, viewModel);
    if (LiveTiles.shouldRecreateClickHandler(viewModel) === true) {
        LiveTiles.setupClickHandler(element, viewModel, viewModel.editMode());
    }

Окно плитки

Ошибка при переходе на другие вкладки

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Этот фрагмент кода необходимо вызвать внутри dispose в необходимом файле .ts.Таким образом, всякий раз, когда пользователь перемещается, вызывается метод dispose, а приведенный ниже код гарантирует удаление metrojs css.

$('.live-tile')['liveTile']("destroy", true);
0 голосов
/ 26 сентября 2018

Если вы хотите узнать, когда пользователь переключился на другую вкладку (как правило, из окна), вы можете перехватить событие blur на window:

$(window).blur(() => console.log("window.blur"));
...