9

Questi sono i miei giorni iniziali di lavoro su BackBone.js. In realtà sono bloccato con la parte del router perché sto ricevendo un errore nella console "Errore: è necessario specificare una proprietà o una funzione url". Questo è il mio scenario; Ho una funzione click che forma dinamicamente un URL REST e recupera i dati dal server di conseguenza.Errore: è necessario specificare una proprietà o una funzione URL

Ecco il codice della funzione click

function onUserClick(obj){ 
    var userID=$(obj).attr('id'); 
    window.location.href="#"+userID+"/"; 
    var userRouter = new UserRouter; 
} 

E ho il seguente codice nel router

var userModel; 
var UserRouter = Backbone.Router.extend({ 
    routes:{ 
     ":userid/":"getUsers" 
    }, 
    getUsers:function(userid){ 
     var url="http://myserver.com/users/"+userid; 
     userModel = new UserModel({urlRoot:url}); 
     var userView = new UserView({el:$(#"container")}); 
    } 
}); 
var UserModel = Backbobe.Model.extend({}); 
var UserView = Backbone.View.extend({ 
    model:userModel, 
    initialize:function(){ 
     _.templateSettings = { 
      interpolate: /\{\{\=(.+?)\}\}/g, 
      evaluate: /\{\{(.+?)\}\}/g 
     }; 
     this.model.fetch(); 
     this.model.bind("change",this.render,this); 
    }, 
    render:function(){ 
     var data=this.model.toJSON(); 
     var userTemplate=_.template($("#userTemplate").text()); 
     var htmlData=userTemplate({ 
      "userData":data 
     }); 
     $(this.el).html(htmlData); 
    } 
}); 

Qualcuno può aiutarmi a capire il problema qui? So di aver fatto qualcosa di sbagliato qui e cerco un consiglio esperto su questo. Un campione di woking per questo scenario è molto apprezzato.

+0

Puoi dare qualche contesto al tuo errore? Che cosa hai provato a fare per risolvere questo ancora? – tkone

risposta

21

stai chiamando fetch del modello:

var UserView = Backbone.View.extend({ 
    model: userModel, 
    initialize: function() { 
     // ... 
     this.model.fetch(); 

Ma non ti ha dato il tuo modello di una proprietà url:

var UserModel = Backbone.Model.extend({}); 

I fetch metodo parla con il server e utilizza url per fare ciò:

urlmodel.url()

Returns the relative URL where the model's resource would be located on the server. If your models are located somewhere else, override this method with the correct logic. Generates URLs of the form: "/[collection.url]/[id]" , falling back to "/[urlRoot]/id" if the model is not part of a collection.

Il default implementation for a Model's url assomiglia a questo:

url: function() { 
    var base = _.result(this, 'urlRoot') || _.result(this.collection, 'url') || urlError(); 
    if (this.isNew()) return base; 
    return base + (base.charAt(base.length - 1) === '/' ? '' : '/') + encodeURIComponent(this.id); 
}, 

Non è un urlRoot, non si dispone di una collezione di delegare la generazione URL, e non hai sovrascritto url così urlError() viene chiamato ed è lì il tuo messaggio di errore viene

L'UserModel richiede una proprietà o una funzione RESTful url in modo da poter eseguire istanze fetch dal server. In alternativa, è possibile creare i modelli da dati già disponibili nell'ambiente lato client (a condizione che non si preveda di salvare nulla tramite Backbone, ovviamente).

+0

Grazie per la tua risposta, è stato utile. –