2011-10-25 1 views
16

Quindi, creazione di un'applicazione che utilizza più (2 per ora) raccolte globali, è un catalogo di entrambi i documenti e pazienti, hanno relazioni, ma non come in, 1 documento o un elenco di documenti appartenenti a 1 paziente, quindi sono in effetti 2 raccolte separate,BackboneJs: come faccio a caricare i miei dati nel markup della pagina e quando li assegno alle mie raccolte

la mia app è strutturata in un sistema di moduli molto simile a come è descritto qui: http://weblog.bocoup.com/organizing-your-backbone-js-application-with-modules

la documentazione di backbone.js dice di bootstrap, per fare qualcosa di simile,

<script> 
    Accounts.reset(<%= @accounts.to_json %>); 
</script> 

che è all'interno di un'applicazione Rails, vorrei però bisogno di farlo in modo diverso in asp.net MVC3, molto probabilmente vorrei solo stampare il mio stringa JSON senza la <% =%>, che non è un rasoio stile motore di visualizzazione)

ma la mia domanda è qui,

questo Accounts.reset(...data...); è appena galleggianti qualche parte nel mio markup, non è in alcun modo ben strutturato nel mio sistema del modulo, non c'è un modo per fare bene Questo? dove posso ottenere i dati, dal mio modulo?

e un'altra domanda lato, supponiamo di avere un percorso nella mia spina dorsale app http://example.com/#documents

e qualcuno chiama questo link direttamente, farò la mia app avere i dati pronti (dal bootstrap) in tempo, prima che il percorso è di per sé eseguito?

+2

Non sono un esperto backbone.js ma ho scritto un semplice JsFiddle che fa questo tipo di bootstrap, anche se un po 'diverso. Fondamentalmente, I quando inizializzo la mia vista, crea la raccolta e chiama Collection.refresh(). Quindi ovunque creo la mia vista, inizializza automaticamente i suoi dati ... o i bootstrap in base alla tua verbosità. Ecco il link a JsFiddle: http: // jsfiddle.net/jcscoobyrs/WVX66/ –

+0

buona idea, ma come ho letto sulla documentazione backbone, utilizzando fetch (o come si aggiorna la tua collezione) non è necessario al caricamento della pagina. perché avere una seconda connessione per recuperare tutti i dati, mentre potresti averlo inviato immediatamente con la pagina. tutto quello che mi chiedo è se il modo in cui lo faccio ora è il modo migliore per darlo con l'html ... come ora basta inserire un tag script, aggiungendo un intero mucchio di dati JSON, che ovviamente rimuoverò dopo l'inizializzazione la mia collezione. tuttavia dal momento che il tuo json proviene da una fonte esterna non puoi usare la mia tecnica per il tuo esempio, quindi usare collection.refresh() sarebbe il migliore – Sander

+0

Backbone.js è stato scritto per interfacciarsi con gli endpoint RESTful e lo fa legando la tua Collezione ad un Punto finale REST utilizzato per recuperare/aggiornare la raccolta. Mentre puoi eseguire il bootstrap delle cose nel modo in cui vuoi, come puoi vedere dalla risposta che hai ottenuto, non è così comune come pensi. Lo scopo di backbone.js e simili è quello di separare l'interfaccia utente/vista dai dati stessi, quindi nelle mie esperienze, non ho mai passato niente di più del codice HTML di HTML per caricare il mio backbone.js che poi farà il suo lavoro di recupero/aggiornamento/gestione i miei oggetti basati su REST. "A ciascuno il suo." :) –

risposta

10

Tendo a impostare gli oggetti application: un oggetto che incapsula tutto il codice necessario per avviare la mia applicazione. Quindi prendo i parametri nel costruttore dell'oggetto, in modo che possano essere utilizzati dall'oggetto app. Passare i dati JSON precaricati nell'oggetto app è una delle cose che faccio, per mantenere il codice sano e incapsulato.

Va qualcosa come questo, di solito:

MyApp = (function(Backbone, _){ 
    var MyModel = Backbone.Model.extend({}); 

    var MyCollection = Backbone.Collection.extend({ 
    model: MyModel 
    }); 

    var MyView = Backbone.View.extend({ 
    initialize: function(){ 
     this.collection.bind("reset", this.render, this); 
    }, 

    render: function(){ 
     // do stuff with the collection here 
    } 
    }); 

    var myApp = function(initialModels){ 
    this.start = function(){ 
     this.models = new MyCollection(); 
     this.myView = new MyView({collection: this.models}); 
     this.models.reset(initialModels); 
    }; 
    }; 

    return myApp; 
})(Backbone, _); 

E poi nella mia pagina che ha bisogno di avviare l'applicazione, faccio questo:

<script language="javascript"> 
    var myApp = new MyApp(<%= mymodels.to_json %>); 
    myApp.start(); 
</script> 

Questa è la versione di rotaie, naturalmente. Basta sostituire lo <%= ... %> con la tua versione per la sintassi Razor in ASP.NET MVC.

+1

Ok, grazie per il tuo aggiornamento, sembra molto simile a quello che faccio, solo lascio tutto il codice in file javascript, l'unica cosa che non mi sentivo a mio agio era il piccolo tag script che ho lasciato nella vista, con la finestra solo per utilizzarlo in un secondo momento nell'istruzione pronta per il mio documento, proprio come lo si consegna direttamente. ma vedo che è il dolore che dovrò sopportare a causa di avere i miei script fuori dai file di visualizzazione, credo. – Sander

0

se su Rails: oltre alla risposta di Dericks, è possibile utilizzare Gon per "ottenere le variabili Rails in js".

allora si sarebbe inizializzare l'app del genere:

<script language="javascript"> 
    var myApp = new MyApp(gon.mymodels); 
    myApp.start(); 
</script> 
0

L'ottimo esempio da Derick! Per MVC 3+ utilizzare questa sintassi:

<script language="javascript"> 
    var myApp = new MyApp(@Html.Raw(Json.Encode(Model))); 
    myApp.start(); 
</script>