2017-03-13 56 views
6

Obecnie używam następujący kod do słuchania zmianą Sheet1!A1:B2:Słuchaj zmiany wartości wielu zakresach z opóźnieniu na

function addEventHandler() { 
    Office.context.document.bindings.addFromNamedItemAsync("Sheet1!A1:B2", "matrix", { id: "myBind" }, function (asyncResult) { 
     Office.select("binding#myBind").addHandlerAsync(Office.EventType.BindingDataChanged, onBindingDataChanged2016); 
    }) 
} 

function onBindingDataChanged2016(eventArgs) { 
    Excel.run(function (ctx) { 
     var foundBinding = ctx.workbook.bindings.getItem(eventArgs.binding.id); 
     var myRange = foundBinding.getRange(); 
     myRange.load(["address", 'values']); 
     return ctx.sync().then(function() { 
      console.log(JSON.stringify({ "address": myRange.address, "value": myRange.values })); 
      // costly reaction 
     }) 
    }) 
} 

Ponieważ moja reakcja na zmiany jest dość kosztowne, chcę Podejmij ją tylko wtedy, gdy jest to naprawdę konieczne. Mam dwa pytania:

1) Jeśli chcę słuchać wielu zakresów, czy możliwe jest zdefiniowanie tylko JEDNEGO słuchacza dla "Sheet1!A1:B2, Sheet1!A9:B10, Sheet1!A100:B120"? Czy muszę dodać JEDNEGO nośnika dla KAŻDEGO zakresu?

2) Czy można wyrazić I listen only to the change of VALUES, a nie formaty itp.?

Opcjonalnie pytanie:

Czy to możliwe, aby określić zwłoki czasowej gdzieś? Na przykład,

  1. możemy zainicjować zegar z 0

  2. jeśli słuchacz jest wyzwalany, możemy nagrać binding id o zmianie i ustawić zegar 0

  3. gdy osiągnie zegar 1 second (tzn. Było cicho przez 1 sekundę), reagujemy na wszystkie zarejestrowane zmiany (tj. Ładujemy wszystkie zmienione zakresy i podejmujemy kosztowną reakcję)

Odpowiedz

1
  1. Biuro JS ma obsługi zdarzeń, który pozwala na słuchanie wielu wiązań, podobnie jak HTML, nie ma sposobu, aby wysłuchać wielu węzłów DOM jednocześnie. Nawet gdyby istniała taka funkcja API, musiałaby ona wewnętrznie tworzyć wiele detektorów, dzięki czemu nie zyskałbyś przewagi wydajności.

  2. Niestety, istnieje no event type available, który rozróżnia zmiany numeryczne i zmiany formatowania.

  3. Możesz jednak odejść na wielką korzyść!

Załóżmy, że masz jakąś funkcję debounce(func, wait, immediate = false) dostępne. *

Wystarczy owinąć na funkcji zmiany w debounce() rozmowy.

function addEventHandler() { 
    Office.context.document.bindings.addFromNamedItemAsync("Sheet1!A1:B2", "matrix", { id: "myBind" }, function (asyncResult) { 
     Office.select("binding#myBind").addHandlerAsync(
      Office.EventType.BindingDataChanged, 
      debounce(onBindingDataChanged2016, 5000) 
     ); 
    }) 
} 

Spowoduje to odrzucenie wszystkich połączeń z numerem onBindingDataChanged2016. Jeśli chcesz zrezygnować z określonego identyfikatora, rzeczy stają się nieco trudniejsze. Trzeba by stworzyć własną funkcję nieczułości, który śledzi timeoutów za wiążącą ID:

function debounceByBindingId(func, wait, immediate) { 
    var timeouts = {}; 
    return function() { 
    var context = this, args = arguments; 
    var eventArgs = arguments[0]; 
    var bindingId = eventArgs.binding.id; 

    var later = function() { 
     timeouts[bindingId] = null; 
     if (!immediate) func.apply(context, args); 
    }; 
    var callNow = immediate && !timeout; 
    clearTimeout(timeouts[bindingId]); 
    timeouts[bindingId] = setTimeout(later, wait); 
    if (callNow) func.apply(context, args); 
    }; 
}; 

* Jak zawsze w ziemi JavaScript, istnieje zbyt wiele opcji do wyboru!

+0

nieczułości działa dobrze, dziękuję bardzo ... – SoftTimur

+0

Inny przykład debouncing (nie z wydarzeniami dokumentów , ale zewnętrzne zdarzenia kliknięcia przyciskiem), patrz ten punkt: https://gist.github.com/Zlatkovsky/0dd0e7281e70af25d67bdb55cd4d7e4b. Możesz go załadować bezpośrednio do [Script Lab] (https://github.com/OfficeDev/script-lab/blob/master/README.md#import), aby uruchomić go za pomocą kilku kliknięć. –