2012-12-15 10 views
5

L'evento dataSource.changed funziona?Kendo UI dataSource evento modificato: funziona?

Dopo la mia griglia di Kendo UI è istanziato, sto legando l'evento di modifica per la documentazione qui:

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

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

sto facendo questo:

// 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(); 
} 

Ma il mio DataChanged() la funzione non viene chiamata quando faccio una di queste cose:

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

o

grid.dataSource.data = aDifferentArray; 

Non sono sicuro esattamente ciò che l'evento 'cambiato' è in attesa di. Che cosa, precisamente, dovrebbe far scattare?

Se creo un dataSource completamente nuovo e lo assegno alla griglia che ha già un dataSource, non vedo come ciò possa innescare l'evento modificato di un'origine dati esistente. Un evento del genere (la griglia che rileva che il suo dataSource è stato sostituito con uno diverso) sarebbe un evento a livello di griglia, non un evento a livello di dati, giusto?

risposta

8

La cosa importante da notare è che il backup dei dati del DataSource è un ObservableArray e che gli elementi di dati in tale matrice vengono convertiti in ObservableObject s.

La change caso di origine dati viene sparato inferiore a 2 condizioni:

  1. I dati ObservableArray modifiche (è inserito un record, cancellato). Un esempio di questo sarebbe l'utilizzo delle funzioni DataSource.add() o DataSource.remove().

  2. Se una proprietà ha modificato eventi bolle fino a DataSource da uno degli oggetti ObservableData nella matrice. Tuttavia, proprio come il resto del framework MVVM di Kendo, la notifica che una proprietà modificata si verifica solo quando viene chiamata la sua funzione .set("propertyName", value).

Questo è il motivo per cui grid.dataSource.data()[1]["deptname"] = 'XXX'; non attiva l'evento di modifica. Se lo cambi in: grid.dataSource.data()[1].set("deptname", 'XXX'); allora dovrebbe iniziare a funzionare. Fondamentalmente, pensare all'evento change come attivato in risposta a una modifica di proprietà MVVM attivata dall'oggetto osservabile data.

Per quanto riguarda la modifica dell'array di dati grid.dataSource.data = aDifferentArray; In realtà non sono sicuro che ciò possa o debba provocare una modifica. Non l'ho mai provato.

+0

grazie per il chiarimento. Il metodo '.set' attiva l'evento change mentre' grid.dataSource.data = aDifferentArray' non lo fa, per quanto ne so. Spero che nella griglia di Kendo ci sia un equivalente all'evento DataSource_Changed nelle griglie di WinForms - attivato quando alla griglia viene assegnata un'origine dati diversa, perché spero di aggiornare la griglia con i nuovi dati ogni 60 secondi: http://stackoverflow.com/ questions/13892021/kendo-ui-grid-refreshing-grid-data-ogni-60-seconds-with-new-data-datasource-a/13892541 # comment19140263_13892541 – Tim

+2

In realtà, per scambiare i dati, penso che si usi ' Funzione .data(): http: //docs.kendoui.com/api/framework/datasource # data quindi il tuo codice sarebbe 'grid.dataSource.data (aDifferentArray);' – CodingWithSpike

+0

eccellente! Grazie mille. – Tim