2012-09-24 5 views
6

Sono nuovo ad eliminazione diretta e sto cercando di ottenere quello che dovrebbe essere un compito semplice attivo e funzionante. Sto lavorando a un'app MVC4 .NET con l'intenzione di associare un selettore di intervalli di date per effettuare richieste ajax per l'aggiornamento dei dati del grafico di Highchart. Sto usando il raccoglitore di date a tema bootstrap di Dan Grossman ed è stato fantastico finora (https://github.com/dangrossman/bootstrap-daterangepicker).Utilizzo di Knockout.js per associare il selettore daterange bootstrap e analizzare il contenuto dell'estensione

L'obiettivo di base è quello di controllare l'intervallo in cui questo raccoglitore di date ranger jQuery si aggiorna, quindi utilizzare knockout per passare questo valore a un'altra parte dell'app per la richiesta di ajax.

Ho provato tutto quello che riesco a trovare in linea. ValueUpdate: modifica dello span all'utilizzo di jQuery all'interno di un knockout per ottenere lo stesso obiettivo, utilizzando una funzione di sottoscrizione per visualizzare il valore dello span prima e dopo il viene utilizzato il selettore di date. Apparentemente questo usa il gestore di eventi jQuery .change(), che è valido solo per input, select e textareas .. non per span.

Ecco il violino di quello che ho finora: http://jsfiddle.net/eyygK/9/

Apprezzo tutto l'aiuto e l'ingresso.

+0

@JaredFarrish Non ero sicuro se avessi bisogno di creare un binding personalizzato perché sto solo cercando di osservare le modifiche apportate a quella singola campata. – jmkr

+0

Non c'è alcun evento di cambiamento per una span, perché normalmente un aggiornamento span avviene da javascript. In tal caso è necessario aggiornare la proprietà viewModel per aggiornare lo span, e non viceversa. Le associazioni ko sono normalmente per l'input dell'utente diretto nell'interfaccia utente (facendo clic, digitando, inviando). – guzart

risposta

4

È sufficiente aggiornare la proprietà currDateRange nel modello di visualizzazione, quando viene aggiornato un nuovo intervallo di date.

$('#reportrange').daterangepicker({ 
    ..., 
    function (start, end) { 
     var dateRangeText = start.toString('MM/d/yy') + ' - ' + end.toString('MM/d/yy'); 
     vm.currDateRange(dateRangeText); 
    } 
}); 

Quindi, quando si aggiorna l'intervallo di date, segnalerà a knockout, e knockout aggiornerà tutti i luoghi dove è utilizzato, il span.

Ora è possibile abbonarsi allo currDateRange e fare le chiamate Ajax da lì.

self.currDateRange = ko.observable("09/24/12 - 09/24/12"); 
self.currDateRange.subscribe(function(newValue) { 
    $.ajax({...}); 
}); 

In questo modo non importa dove l'aggiornamento viene, ad eliminazione diretta notificherà a tutti.

+0

Ottengo ['Uncaught TypeError: Object function ViewModel() {...} non ha metodo 'currDateRange''] (http://jsfiddle.net/eyygK/12/) in Chrome Console, ma registra l'iniziale apertura del selettore dell'intervallo di date. –

+0

Assicurarsi che l'istanza ViewModel sia visibile dall'interno del daterangepicker. Ho appena notato, ma hai chiamato l'istanza del modello di visualizzazione ('vm'). Quindi invece di 'viewModel' (in minuscolo v) prova' vm'. – guzart

+0

http://jsfiddle.net/eyygK/13/ –

Problemi correlati