2013-02-04 10 views
6

Attualmente sto cercando Backbone come un modo per organizzare i nostri file javascript e creare una struttura pulita per il nostro codice.Backbone.js Utilities

La mia domanda è principalmente una domanda "Best Practice".

La libreria funziona alla grande e ho installato correttamente la mia struttura con AMD e requirejs. La mia domanda riguarda un paio di file di utilità che sto utilizzando. Uno ottiene i dati da un documento XML e lo converte in un oggetto dati json (in modo che i dati possano essere localizzati). L'altra è un'utilità che carica e si connette a Facebook. Ho creato entrambi questi come 'Modelli'.

Probabilmente questi modelli dovrebbero probabilmente essere "Controllori" poiché si collegano ai servizi, ma questi devono essere chiamati senza la necessità di cercare un hashbang in un file router (o controller).

Devo estendere il modello di dorsali per questi due file di utilità o c'è qualcos'altro che dovrei fare per implementare file di utilità come questo?

+0

Grande domanda! Questo e 'esattamente quello che stavo cercando. Sciocco che è chiuso. – Kieveli

risposta

6

Non c'è niente in modo oggettivo sbagliato con l'utilizzo di Backbone.Model s per questo scopo, ma a prescindere si senta pesce. Il modello viene fornito con bagaglio extra che non appartiene a una classe di tipo "servizio" o "utilità".

Invece ho definito una classe base più generica, evented per funzionalità che non si adatta perfettamente al paradigma Backbone Model-View-Collection-Router.

define(['backbone', 'underscore'], function(Backbone, _) { 

    var Class = function() { 
    this.initialize.apply(this, arguments); 
    }; 

    //give Class events and a default constructor 
    _.extend(Class.prototype, Backbone.Events, {initialize: function() {}}); 

    //copy the extend feature from one of the backbone classes 
    Class.extend = Backbone.Model.extend; 

    return Class; 
}); 

La classe si comporta come gli altri oggetti backbone, nel senso che può essere extend cata, le sue istanze hanno un metodo initialize costruttore e che supportano gli eventi. Uno dei tuoi esempi, il servizio di localizzazione, potrebbe somigliare:

var LocalizationService = Class.extend({ 
    initialize: function(url) { 
    this.url = url; 
    this.fetch(); 
    }, 

    fetch: function({ 
    var self = this; 
    $.ajax({ 
     url:this.url, 
     success: function(response) { 
     self.response = response; 
     self.trigger('fetch:complete', self, response); 
     //etc... 
     } 
    }); 
    } 
}); 
+0

Questo era esattamente quello che stavo cercando. Grazie molto! :-) –