9

Estos son mis días iniciales de trabajo en BackBone.js. De hecho, estoy atorado con la parte del enrutador ya que recibo un error en la consola "Error: se debe especificar una propiedad o función url". Este es mi escenario; Tengo una función de clic que forma dinámicamente una URL REST, y obtengo los datos del servidor en consecuencia.Error: se debe especificar una propiedad o función url

Aquí está el código de función de clic

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

y tengo el siguiente código en el 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); 
    } 
}); 

Puede alguien ayudarme a averiguar el problema aquí? Sé que he hecho algo mal aquí y busco un consejo experto sobre esto. Una muestra de woking para este escenario es muy apreciada.

+0

¿Puede dar contexto a su error? ¿Qué has intentado hacer para resolver esto todavía? – tkone

Respuesta

21

Estás llamando fetch en su modelo:

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

Pero no se dio por su modelo de un url propiedad:

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

Los fetch método se comunica con el servidor y se utiliza url para hacerlo:

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.

El default implementation for a Model's url se parece a esto:

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); 
}, 

Usted no tiene un urlRoot, usted no tiene una colección de delegar la generación de URL, y no se ha anulado url por lo urlError() obtiene la llamada y ahí es donde tu mensaje de error viene de.

Su UserModel necesita una propiedad o función RESTful url para que pueda fetch instancias desde el servidor. Alternativamente, podría crear sus modelos a partir de datos que ya están disponibles en su entorno del lado del cliente (siempre que no esté planeando guardar nada mediante Backbone, por supuesto).

+0

Gracias por su respuesta, ha sido útil. –

Cuestiones relacionadas