2012-12-15 11 views
5

Czy zdarzenie dataSource.changed działa?Dane zmiennego źródła danych Kendo: czy działa?

Po moja siatka Kendo UI jest tworzony, jestem wiążące zdarzenie zmianie na dokumentacji tutaj:

http://docs.kendoui.com/api/framework/datasource#change

//To set after initialization 
dataSource.bind("change", function(e) { 
    // handle event 
}); 

robie to:

// initialize 
$("#grid").kendoGrid({ 
     dataSource: dataSource, 

     blah blah blah 
) 

}); 
// end of initialization 



// bind afterwards 
var grid = $('#grid').data('kendoGrid'); 
    grid.dataSource.bind("change", function (e) { 
     dataChanged(); 
    }); 


//also tried a setTimeout: 

    // bind afterwards 
    setTimeout(function() { 
    var grid = $('#grid').data('kendoGrid'); 
    grid.dataSource.bind("change", function (e) { 
     dataChanged(); 
    }); 
}, 350); 



function dataChanged() { 
    // handle "change" whatever that means -- documentation definition is hazy 
    // does reassigning the data array constitute a change? 
    // does changing the value of a particular item in the data array 
    // constitute a change? 
    // does removing an item from the data array constitute a change? 

    var grid = $("#grid").data("kendoGrid"); 
    grid.refresh(); 
} 

ale mój dataChanged Funkcja() nie jest wywoływana, gdy wykonuję jedną z poniższych czynności:

var grid = $('#grid').data('kendoGrid'); 
grid.dataSource.data()[1]["deptname"] = 'XXX'; 

lub

grid.dataSource.data = aDifferentArray; 

Nie jestem pewien, co dokładnie „zmienił” zdarzenie nasłuchuje. Co dokładnie ma go uruchomić?

Jeśli utworzę zupełnie nowe źródło danych i przypisze je do siatki, która już ma źródło danych, nie widzę sposobu, w jaki mogłoby to spowodować zmianę zdarzenia istniejącego źródła danych. Takie zdarzenie (siatka zauważająca, że ​​jego źródło danych zostało zamienione na inne) byłoby zdarzeniem na poziomie siatki, a nie zdarzeniem na poziomie źródła danych, prawda?

Odpowiedz

8

Ważną rzeczą jest, aby pamiętać, że dane oparta jest DataSource jest ObservableArray i że elementy danych w tej tablicy są konwertowane do ObservableObject s.

change wydarzeniem źródłem danych jest zwolniony poniżej 2 warunki:

  1. dotyczące danych ObservableArray zmiany (rekord jest wstawionych). Przykładem tego może być użycie funkcji DataSource.add() lub.

  2. Jeśli właściwość zmieniła dymki zdarzeń do źródła danych z jednego z obiektów ObservableData w tablicy. Jednak, podobnie jak reszta ramach Kendo MVVM, powiadomienie, że nieruchomość zmieniła tylko wtedy, gdy jego .set("propertyName", value) funkcja jest wywoływana.

Z tego powodu grid.dataSource.data()[1]["deptname"] = 'XXX'; nie wywołuje zdarzenia zmiany. Jeśli zmienisz to na: grid.dataSource.data()[1].set("deptname", 'XXX');, to powinno zacząć działać. Zasadniczo pomyśl o zdarzeniu change jako wywołanym w odpowiedzi na zmianę właściwości MVVM wystrzeloną z obserwowalnego obiektu data.

Co do zmiany tablicy danych grid.dataSource.data = aDifferentArray; Nie jestem właściwie pewien, czy to spowoduje zmianę. Nigdy tego nie próbowałem.

+0

dziękuję za wyjaśnienie. Metoda '.set' wywołuje zdarzenie change, podczas gdy' grid.dataSource.data = aDifferentArray', o ile wiem. Mam nadzieję, że nie jest w Kendo siatki odpowiednikiem imprezy DataSource_Changed w WinForms siatek - zwolniony, gdy siatka jest przypisany inny źródło danych, ponieważ mam nadzieję, aby odświeżyć siatkę z nowych danych co 60 sekund: http://stackoverflow.com/ pytania/13892021 /-każdy-60 kendo-ui-grid-orzeźwiający-grid-data-sekundy-with-new-danych DataSource-a/13.892.541 # comment19140263_13892541 – Tim

+2

Właściwie, aby zamienić się dane, myślę użyć ' .data() 'funkcja: http: //docs.kendoui.com/api/framework/datasource # data, więc Twój kod będzie miał postać 'grid.dataSource.data (aDifferentArray);' – CodingWithSpike

+0

excellent! Dziękuję bardzo. – Tim

Powiązane problemy